mirror of https://github.com/apache/maven.git
[MNG-7664] consolidate Velocity templates used to generate code from models (#949)
This commit is contained in:
parent
c1a900190f
commit
74548dde8e
|
@ -41,27 +41,6 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-mdo</id>
|
||||
<goals>
|
||||
<goal>attach-artifact</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<artifacts>
|
||||
<artifact>
|
||||
<file>src/main/mdo/maven.mdo</file>
|
||||
<type>mdo</type>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
|
@ -73,14 +52,16 @@ under the License.
|
|||
</goals>
|
||||
<configuration>
|
||||
<version>4.2.0</version>
|
||||
<velocityBasedir>${project.basedir}/../../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>src/main/mdo/maven.mdo</model>
|
||||
</models>
|
||||
<templates>
|
||||
<template>src/main/mdo/model.vm</template>
|
||||
<template>model.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV4=org.apache.maven.api.model</param>
|
||||
<param>isMavenModel=true</param>
|
||||
</params>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
|
|
@ -1,558 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV4}" )
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#set ( $inheritedFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#if ( $cl != $class )
|
||||
#set ( $dummy = $inheritedFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $className = "${class.name}" )
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
#if ( $class.name != "InputLocation" && $class.name != "InputSource" )
|
||||
#set ( $types = { } )
|
||||
#set ( $imports = $class.getClass().forName("java.util.TreeSet").newInstance() )
|
||||
#set ( $dummy = $imports.add( "java.io.Serializable" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collections" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.HashMap" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Experimental" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Generated" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Immutable" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Nonnull" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.NotThreadSafe" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.ThreadSafe" ) )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.type == "java.util.List" )
|
||||
#set ( $dummy = $imports.add( "java.util.ArrayList" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collection" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.List" ) )
|
||||
#set ( $dummy = $types.put( $field, "List<" + $field.to + ">" ) )
|
||||
#elseif ( $field.type == "java.util.Properties" )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $types.put( $field, "Map<String, String>" ) )
|
||||
#elseif ( $field.type == "DOM" )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.xml.XmlNode" ) )
|
||||
#set ( $dummy = $types.put( $field, "XmlNode" ) )
|
||||
#else
|
||||
#set ( $fieldType = ${types.getOrDefault($field.type,$field.type)} )
|
||||
#set ( $idx = $fieldType.lastIndexOf('.') )
|
||||
#if ( $idx > 0 )
|
||||
#set ( $dummy = $imports.add( $fieldType ) )
|
||||
#set ( $dummy = $types.put( $fieldType, $fieldType.substring( $idx + 1 ) ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#set ( $eq = "" )
|
||||
#set ( $hc = "" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.identifier )
|
||||
#set ( $dummy = $imports.add( "java.util.Objects" ) )
|
||||
#set ( $dummy = $identifiers.add( $field ) )
|
||||
#if ( $eq == "" )
|
||||
#set ( $eq = "Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#else
|
||||
#set ( $eq = "$eq && Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#end
|
||||
#if ( $hc == "" )
|
||||
#set ( $hc = "${field.name}" )
|
||||
#else
|
||||
#set ( $hc = "$hc, this.${field.name}" )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
#foreach ( $imp in $imports )
|
||||
import $imp;
|
||||
#end
|
||||
|
||||
/**
|
||||
#foreach ( $line in ${class.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
@Experimental
|
||||
@Generated @ThreadSafe @Immutable
|
||||
public class ${class.name}
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
implements Serializable, InputLocationTracker
|
||||
#else
|
||||
implements Serializable
|
||||
#end
|
||||
{
|
||||
#if ( $class == $root )
|
||||
final String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
/**
|
||||
#foreach ( $line in ${field.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
final ${type} $field.name;
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
/** Location of the xml element for this object. */
|
||||
final InputLocation location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
/** Location of the xml element for the field ${field.name}. */
|
||||
final InputLocation ${field.name}Location;
|
||||
#end
|
||||
#if ( ! $class.superClass )
|
||||
/** Other locations */
|
||||
final Map<Object, InputLocation> locations;
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Constructor for this class, package protected.
|
||||
* @see Builder#build()
|
||||
*/
|
||||
${class.name}(
|
||||
#if ( $class == $root )
|
||||
String modelEncoding,
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
$type $field.name${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations,
|
||||
#set ( $sep = "#if(${allFields.size()}>0),#end" )
|
||||
InputLocation location${sep}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
InputLocation ${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
)
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super(
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations,
|
||||
#set ( $sep = "#if(${inheritedFields.size()}>0),#end" )
|
||||
location${sep}
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
this.modelEncoding = modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" || $field.type == "java.util.Map" )
|
||||
this.${field.name} = ImmutableCollections.copy( ${field.name} );
|
||||
#else
|
||||
this.${field.name} = ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
this.locations = ImmutableCollections.copy( locations );
|
||||
this.location = location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name}Location = ${field.name}Location;
|
||||
#end
|
||||
#end
|
||||
}
|
||||
|
||||
#if ( ! $eq.empty )
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
if ( this == o )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ( o == null || !( o instanceof ${class.name} ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
${class.name} that = ( ${class.name} ) o;
|
||||
return ${eq};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return Objects.hash( ${hc} );
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
public String getModelEncoding()
|
||||
{
|
||||
return modelEncoding;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type == "boolean" || $type == "Boolean" )
|
||||
#set ( $pfx = "is" )
|
||||
#else
|
||||
#set ( $pfx = "get" )
|
||||
#end
|
||||
/**
|
||||
#set ( $desc = ${field.description.trim()} )
|
||||
#foreach ( $line in ${desc.split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*
|
||||
* @return a {@code ${type}}
|
||||
*/
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" )
|
||||
@Nonnull
|
||||
#end
|
||||
public ${type} ${pfx}${cap}()
|
||||
{
|
||||
return this.${field.name};
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
/**
|
||||
* Gets the location of the specified field in the input source.
|
||||
*/
|
||||
public InputLocation getLocation( Object key )
|
||||
{
|
||||
if ( key instanceof String )
|
||||
{
|
||||
switch ( ( String ) key )
|
||||
{
|
||||
#if ( ! $class.superClass )
|
||||
case "":
|
||||
return location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
case "${field.name}":
|
||||
return ${field.name}Location;
|
||||
#end
|
||||
}
|
||||
}
|
||||
#if ( $class.superClass )
|
||||
return super.getLocation( key );
|
||||
#else
|
||||
return locations != null ? locations.get( key ) : null;
|
||||
#end
|
||||
}
|
||||
|
||||
#end
|
||||
/**
|
||||
* Creates a new builder with this object as the basis.
|
||||
*
|
||||
* @return a {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public Builder with()
|
||||
{
|
||||
return newBuilder( this );
|
||||
}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance using the specified ${field.name}.
|
||||
*
|
||||
* @param ${field.name} the new {@code $type} to use
|
||||
* @return a {@code ${class.name}} with the specified ${field.name}
|
||||
*/
|
||||
@Nonnull
|
||||
public ${class.name} with${cap}( $type $field.name )
|
||||
{
|
||||
return with().${field.name}( $field.name ).build();
|
||||
}
|
||||
#end
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance.
|
||||
* Equivalent to {@code newInstance( true )}.
|
||||
* @see #newInstance(boolean)
|
||||
*
|
||||
* @return a new {@code ${class.name}}
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance()
|
||||
{
|
||||
return newInstance( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance using default values or not.
|
||||
* Equivalent to {@code newBuilder( withDefaults ).build()}.
|
||||
*
|
||||
* @param withDefaults the boolean indicating whether default values should be used
|
||||
* @return a new {@code ${class.name}}
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance( boolean withDefaults )
|
||||
{
|
||||
return newBuilder( withDefaults ).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance.
|
||||
* Equivalent to {@code newBuilder( true )}.
|
||||
* @see #newBuilder(boolean)
|
||||
*
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder()
|
||||
{
|
||||
return newBuilder( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using default values or not.
|
||||
*
|
||||
* @param withDefaults the boolean indicating whether default values should be used
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( boolean withDefaults )
|
||||
{
|
||||
return new Builder( withDefaults );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using the specified object as a basis.
|
||||
* Equivalent to {@code newBuilder( from, false )}.
|
||||
*
|
||||
* @param from the {@code ${class.name}} instance to use as a basis
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from )
|
||||
{
|
||||
return newBuilder( from, false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using the specified object as a basis.
|
||||
*
|
||||
* @param from the {@code ${class.name}} instance to use as a basis
|
||||
* @param forceCopy the boolean indicating if a copy should be forced
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from, boolean forceCopy )
|
||||
{
|
||||
return new Builder( from, forceCopy );
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder class used to create ${class.name} instances.
|
||||
* @see #with()
|
||||
* @see #newBuilder()
|
||||
*/
|
||||
@NotThreadSafe
|
||||
public static class Builder
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}.Builder
|
||||
#end
|
||||
{
|
||||
${class.name} base;
|
||||
#if ( $class == $root )
|
||||
String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
#if ( $type == 'boolean' )
|
||||
Boolean ${field.name};
|
||||
#elseif ( $type == 'int' )
|
||||
Integer ${field.name};
|
||||
#else
|
||||
${type} ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( ! $class.superClass && $locationTracking )
|
||||
Map<Object, InputLocation> locations;
|
||||
#end
|
||||
|
||||
Builder( boolean withDefaults )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( withDefaults );
|
||||
#end
|
||||
if ( withDefaults )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.defaultValue )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $field.type == "String" )
|
||||
this.${field.name} = "${field.defaultValue}";
|
||||
#elseif ( $field.type != "java.util.List" && $field.type != "java.util.Properties" )
|
||||
this.${field.name} = ${field.defaultValue};
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
Builder( ${class.name} base, boolean forceCopy )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( base, forceCopy );
|
||||
#end
|
||||
if ( forceCopy )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name} = base.${field.name};
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
this.base = base;
|
||||
}
|
||||
}
|
||||
|
||||
#if ( $class == $root )
|
||||
@Nonnull
|
||||
public Builder modelEncoding( String modelEncoding )
|
||||
{
|
||||
this.modelEncoding = modelEncoding;
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
@Nonnull
|
||||
public Builder ${field.name}( ${type} ${field.name} )
|
||||
{
|
||||
this.${field.name} = ${field.name};
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
#if ( $locationTracking )
|
||||
@Nonnull
|
||||
public Builder location( Object key, InputLocation location )
|
||||
{
|
||||
if ( location != null )
|
||||
{
|
||||
if ( this.locations == null )
|
||||
{
|
||||
this.locations = new HashMap<>();
|
||||
}
|
||||
this.locations.put( key, location );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
@Nonnull
|
||||
public ${class.name} build()
|
||||
{
|
||||
if ( base != null
|
||||
#foreach ( $field in $allFields )
|
||||
&& ( ${field.name} == null || ${field.name} == base.${field.name} )
|
||||
#end
|
||||
)
|
||||
{
|
||||
return base;
|
||||
}
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations = null;
|
||||
InputLocation location = null;
|
||||
#foreach ( $field in $allFields )
|
||||
InputLocation ${field.name}Location = null;
|
||||
#end
|
||||
if ( this.locations != null )
|
||||
{
|
||||
locations = this.locations;
|
||||
location = locations.remove( "" );
|
||||
#foreach ( $field in $allFields )
|
||||
${field.name}Location = locations.remove( "${field.name}" );
|
||||
#end
|
||||
}
|
||||
#end
|
||||
return new ${class.name}(
|
||||
#if ( $class == $root )
|
||||
modelEncoding != null ? modelEncoding : ( base != null ? base.modelEncoding : "UTF-8" ),
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#if ( $field.type == "boolean" || $field.type == "int" )
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : ${field.defaultValue} )${sep}
|
||||
#else
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : null )${sep}
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations != null ? locations : ( base != null ? base.locations : null ),
|
||||
#set ( $sep = "#if(${allFields.size()}>0),#end" )
|
||||
location != null ? location : ( base != null ? base.location : null )${sep}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
${field.name}Location != null ? ${field.name}Location : ( base != null ? base.${field.name}Location : null )${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#foreach ( $cs in $class.getCodeSegments($version) )
|
||||
$cs.code
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
|
@ -41,27 +41,6 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-mdo</id>
|
||||
<goals>
|
||||
<goal>attach-artifact</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<artifacts>
|
||||
<artifact>
|
||||
<file>src/main/mdo/settings.mdo</file>
|
||||
<type>mdo</type>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
|
@ -73,11 +52,12 @@ under the License.
|
|||
</goals>
|
||||
<configuration>
|
||||
<version>2.0.0</version>
|
||||
<velocityBasedir>${project.basedir}/../../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>src/main/mdo/settings.mdo</model>
|
||||
</models>
|
||||
<templates>
|
||||
<template>src/main/mdo/model.vm</template>
|
||||
<template>model.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV4=org.apache.maven.api.settings</param>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
##
|
||||
## Nothing special to do here
|
||||
##
|
|
@ -1,558 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV4}" )
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#set ( $inheritedFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#if ( $cl != $class )
|
||||
#set ( $dummy = $inheritedFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $className = "${class.name}" )
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
#if ( $class.name != "InputLocation" && $class.name != "InputSource" )
|
||||
#set ( $types = { } )
|
||||
#set ( $imports = $class.getClass().forName("java.util.TreeSet").newInstance() )
|
||||
#set ( $dummy = $imports.add( "java.io.Serializable" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collections" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.HashMap" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Experimental" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Generated" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Immutable" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Nonnull" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.NotThreadSafe" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.ThreadSafe" ) )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.type == "java.util.List" )
|
||||
#set ( $dummy = $imports.add( "java.util.ArrayList" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collection" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.List" ) )
|
||||
#set ( $dummy = $types.put( $field, "List<" + $field.to + ">" ) )
|
||||
#elseif ( $field.type == "java.util.Properties" )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $types.put( $field, "Map<String, String>" ) )
|
||||
#elseif ( $field.type == "DOM" )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.xml.XmlNode" ) )
|
||||
#set ( $dummy = $types.put( $field, "XmlNode" ) )
|
||||
#else
|
||||
#set ( $fieldType = ${types.getOrDefault($field.type,$field.type)} )
|
||||
#set ( $idx = $fieldType.lastIndexOf('.') )
|
||||
#if ( $idx > 0 )
|
||||
#set ( $dummy = $imports.add( $fieldType ) )
|
||||
#set ( $dummy = $types.put( $fieldType, $fieldType.substring( $idx + 1 ) ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#set ( $eq = "" )
|
||||
#set ( $hc = "" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.identifier )
|
||||
#set ( $dummy = $imports.add( "java.util.Objects" ) )
|
||||
#set ( $dummy = $identifiers.add( $field ) )
|
||||
#if ( $eq == "" )
|
||||
#set ( $eq = "Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#else
|
||||
#set ( $eq = "$eq && Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#end
|
||||
#if ( $hc == "" )
|
||||
#set ( $hc = "${field.name}" )
|
||||
#else
|
||||
#set ( $hc = "$hc, this.${field.name}" )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
#foreach ( $imp in $imports )
|
||||
import $imp;
|
||||
#end
|
||||
|
||||
/**
|
||||
#foreach ( $line in ${class.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
@Experimental
|
||||
@Generated @ThreadSafe @Immutable
|
||||
public class ${class.name}
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
implements Serializable, InputLocationTracker
|
||||
#else
|
||||
implements Serializable
|
||||
#end
|
||||
{
|
||||
#if ( $class == $root )
|
||||
final String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
/**
|
||||
#foreach ( $line in ${field.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
final ${type} $field.name;
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
/** Location of the xml element for this object. */
|
||||
final InputLocation location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
/** Location of the xml element for the field ${field.name}. */
|
||||
final InputLocation ${field.name}Location;
|
||||
#end
|
||||
#if ( ! $class.superClass )
|
||||
/** Other locations */
|
||||
final Map<Object, InputLocation> locations;
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Constructor for this class, package protected.
|
||||
* @see Builder#build()
|
||||
*/
|
||||
${class.name}(
|
||||
#if ( $class == $root )
|
||||
String modelEncoding,
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
$type $field.name${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations,
|
||||
#set ( $sep = "#if(${allFields.size()}>0),#end" )
|
||||
InputLocation location${sep}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
InputLocation ${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
)
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super(
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations,
|
||||
#set ( $sep = "#if(${inheritedFields.size()}>0),#end" )
|
||||
location${sep}
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
this.modelEncoding = modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" || $field.type == "java.util.Map" )
|
||||
this.${field.name} = ImmutableCollections.copy( ${field.name} );
|
||||
#else
|
||||
this.${field.name} = ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
this.locations = ImmutableCollections.copy( locations );
|
||||
this.location = location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name}Location = ${field.name}Location;
|
||||
#end
|
||||
#end
|
||||
}
|
||||
|
||||
#if ( ! $eq.empty )
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
if ( this == o )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ( o == null || !( o instanceof ${class.name} ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
${class.name} that = ( ${class.name} ) o;
|
||||
return ${eq};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return Objects.hash( ${hc} );
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
public String getModelEncoding()
|
||||
{
|
||||
return modelEncoding;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type == "boolean" || $type == "Boolean" )
|
||||
#set ( $pfx = "is" )
|
||||
#else
|
||||
#set ( $pfx = "get" )
|
||||
#end
|
||||
/**
|
||||
#set ( $desc = ${field.description.trim()} )
|
||||
#foreach ( $line in ${desc.split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*
|
||||
* @return a {@code ${type}}
|
||||
*/
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" )
|
||||
@Nonnull
|
||||
#end
|
||||
public ${type} ${pfx}${cap}()
|
||||
{
|
||||
return this.${field.name};
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
/**
|
||||
* Gets the location of the specified field in the input source.
|
||||
*/
|
||||
public InputLocation getLocation( Object key )
|
||||
{
|
||||
if ( key instanceof String )
|
||||
{
|
||||
switch ( ( String ) key )
|
||||
{
|
||||
#if ( ! $class.superClass )
|
||||
case "":
|
||||
return location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
case "${field.name}":
|
||||
return ${field.name}Location;
|
||||
#end
|
||||
}
|
||||
}
|
||||
#if ( $class.superClass )
|
||||
return super.getLocation( key );
|
||||
#else
|
||||
return locations != null ? locations.get( key ) : null;
|
||||
#end
|
||||
}
|
||||
|
||||
#end
|
||||
/**
|
||||
* Creates a new builder with this object as the basis.
|
||||
*
|
||||
* @return a {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public Builder with()
|
||||
{
|
||||
return newBuilder( this );
|
||||
}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance using the specified ${field.name}.
|
||||
*
|
||||
* @param ${field.name} the new {@code $type} to use
|
||||
* @return a {@code ${class.name}} with the specified ${field.name}
|
||||
*/
|
||||
@Nonnull
|
||||
public ${class.name} with${cap}( $type $field.name )
|
||||
{
|
||||
return with().${field.name}( $field.name ).build();
|
||||
}
|
||||
#end
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance.
|
||||
* Equivalent to {@code newInstance( true )}.
|
||||
* @see #newInstance(boolean)
|
||||
*
|
||||
* @return a new {@code ${class.name}}
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance()
|
||||
{
|
||||
return newInstance( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} instance using default values or not.
|
||||
* Equivalent to {@code newBuilder( withDefaults ).build()}.
|
||||
*
|
||||
* @param withDefaults the boolean indicating whether default values should be used
|
||||
* @return a new {@code ${class.name}}
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance( boolean withDefaults )
|
||||
{
|
||||
return newBuilder( withDefaults ).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance.
|
||||
* Equivalent to {@code newBuilder( true )}.
|
||||
* @see #newBuilder(boolean)
|
||||
*
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder()
|
||||
{
|
||||
return newBuilder( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using default values or not.
|
||||
*
|
||||
* @param withDefaults the boolean indicating whether default values should be used
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( boolean withDefaults )
|
||||
{
|
||||
return new Builder( withDefaults );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using the specified object as a basis.
|
||||
* Equivalent to {@code newBuilder( from, false )}.
|
||||
*
|
||||
* @param from the {@code ${class.name}} instance to use as a basis
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from )
|
||||
{
|
||||
return newBuilder( from, false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@code ${class.name}} builder instance using the specified object as a basis.
|
||||
*
|
||||
* @param from the {@code ${class.name}} instance to use as a basis
|
||||
* @param forceCopy the boolean indicating if a copy should be forced
|
||||
* @return a new {@code Builder}
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from, boolean forceCopy )
|
||||
{
|
||||
return new Builder( from, forceCopy );
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder class used to create ${class.name} instances.
|
||||
* @see #with()
|
||||
* @see #newBuilder()
|
||||
*/
|
||||
@NotThreadSafe
|
||||
public static class Builder
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}.Builder
|
||||
#end
|
||||
{
|
||||
${class.name} base;
|
||||
#if ( $class == $root )
|
||||
String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
#if ( $type == 'boolean' )
|
||||
Boolean ${field.name};
|
||||
#elseif ( $type == 'int' )
|
||||
Integer ${field.name};
|
||||
#else
|
||||
${type} ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( ! $class.superClass && $locationTracking )
|
||||
Map<Object, InputLocation> locations;
|
||||
#end
|
||||
|
||||
Builder( boolean withDefaults )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( withDefaults );
|
||||
#end
|
||||
if ( withDefaults )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.defaultValue )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $field.type == "String" )
|
||||
this.${field.name} = "${field.defaultValue}";
|
||||
#elseif ( $field.type != "java.util.List" && $field.type != "java.util.Properties" )
|
||||
this.${field.name} = ${field.defaultValue};
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
Builder( ${class.name} base, boolean forceCopy )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( base, forceCopy );
|
||||
#end
|
||||
if ( forceCopy )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name} = base.${field.name};
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
this.base = base;
|
||||
}
|
||||
}
|
||||
|
||||
#if ( $class == $root )
|
||||
@Nonnull
|
||||
public Builder modelEncoding( String modelEncoding )
|
||||
{
|
||||
this.modelEncoding = modelEncoding;
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
@Nonnull
|
||||
public Builder ${field.name}( ${type} ${field.name} )
|
||||
{
|
||||
this.${field.name} = ${field.name};
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
#if ( $locationTracking )
|
||||
@Nonnull
|
||||
public Builder location( Object key, InputLocation location )
|
||||
{
|
||||
if ( location != null )
|
||||
{
|
||||
if ( this.locations == null )
|
||||
{
|
||||
this.locations = new HashMap<>();
|
||||
}
|
||||
this.locations.put( key, location );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
@Nonnull
|
||||
public ${class.name} build()
|
||||
{
|
||||
if ( base != null
|
||||
#foreach ( $field in $allFields )
|
||||
&& ( ${field.name} == null || ${field.name} == base.${field.name} )
|
||||
#end
|
||||
)
|
||||
{
|
||||
return base;
|
||||
}
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations = null;
|
||||
InputLocation location = null;
|
||||
#foreach ( $field in $allFields )
|
||||
InputLocation ${field.name}Location = null;
|
||||
#end
|
||||
if ( this.locations != null )
|
||||
{
|
||||
locations = this.locations;
|
||||
location = locations.remove( "" );
|
||||
#foreach ( $field in $allFields )
|
||||
${field.name}Location = locations.remove( "${field.name}" );
|
||||
#end
|
||||
}
|
||||
#end
|
||||
return new ${class.name}(
|
||||
#if ( $class == $root )
|
||||
modelEncoding != null ? modelEncoding : ( base != null ? base.modelEncoding : "UTF-8" ),
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#if ( $field.type == "boolean" || $field.type == "int" )
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : ${field.defaultValue} )${sep}
|
||||
#else
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : null )${sep}
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations != null ? locations : ( base != null ? base.locations : null ),
|
||||
#set ( $sep = "#if(${allFields.size()}>0),#end" )
|
||||
location != null ? location : ( base != null ? base.location : null )${sep}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
${field.name}Location != null ? ${field.name}Location : ( base != null ? base.${field.name}Location : null )${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#foreach ( $cs in $class.getCodeSegments($version) )
|
||||
$cs.code
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
|
@ -40,27 +40,6 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>3.2.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-mdo</id>
|
||||
<goals>
|
||||
<goal>attach-artifact</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<artifacts>
|
||||
<artifact>
|
||||
<file>src/main/mdo/toolchains.mdo</file>
|
||||
<type>mdo</type>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
|
@ -72,11 +51,12 @@ under the License.
|
|||
</goals>
|
||||
<configuration>
|
||||
<version>1.1.0</version>
|
||||
<velocityBasedir>${project.basedir}/../../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>src/main/mdo/toolchains.mdo</model>
|
||||
</models>
|
||||
<templates>
|
||||
<template>src/main/mdo/model.vm</template>
|
||||
<template>model.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV4=org.apache.maven.api.toolchain</param>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
##
|
||||
## Nothing special to do here
|
||||
##
|
|
@ -46,43 +46,21 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-maven.mdo</id>
|
||||
<goals>
|
||||
<goal>copy</goal>
|
||||
</goals>
|
||||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<artifactItems>
|
||||
<artifactItem>
|
||||
<groupId>org.apache.maven</groupId>
|
||||
<artifactId>maven-api-model</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>mdo</type>
|
||||
<outputDirectory>target/mdo/</outputDirectory>
|
||||
<destFileName>maven.mdo</destFileName>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<basedir>${project.basedir}/../api/maven-api-model</basedir>
|
||||
<velocityBasedir>${project.basedir}/../src/mdo</velocityBasedir>
|
||||
<version>4.0.0</version>
|
||||
<models>
|
||||
<model>target/mdo/maven.mdo</model>
|
||||
<model>src/main/mdo/maven.mdo</model>
|
||||
</models>
|
||||
<params>
|
||||
<param>packageModelV3=org.apache.maven.model</param>
|
||||
<param>packageModelV4=org.apache.maven.api.model</param>
|
||||
<param>packageToolV4=org.apache.maven.model.v4</param>
|
||||
<param>isMavenModel=true</param>
|
||||
</params>
|
||||
</configuration>
|
||||
<executions>
|
||||
|
@ -103,7 +81,7 @@ under the License.
|
|||
<configuration>
|
||||
<version>4.1.0</version>
|
||||
<templates>
|
||||
<template>src/main/mdo/model-v3.vm</template>
|
||||
<template>model-v3-modified.vm</template>
|
||||
</templates>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@ -116,12 +94,12 @@ under the License.
|
|||
<configuration>
|
||||
<version>4.2.0</version>
|
||||
<templates>
|
||||
<template>src/main/mdo/merger.vm</template>
|
||||
<template>src/main/mdo/transformer.vm</template>
|
||||
<template>src/main/mdo/reader.vm</template>
|
||||
<template>src/main/mdo/reader-ex.vm</template>
|
||||
<template>src/main/mdo/writer.vm</template>
|
||||
<template>src/main/mdo/writer-ex.vm</template>
|
||||
<template>merger.vm</template>
|
||||
<template>transformer.vm</template>
|
||||
<template>reader-modified.vm</template>
|
||||
<template>reader-ex.vm</template>
|
||||
<template>writer.vm</template>
|
||||
<template>writer-ex.vm</template>
|
||||
</templates>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#
|
||||
##
|
||||
## The following loop code is required in order to change the type of the
|
||||
## pomFile attribute to a java.nio.file.Path. Modello does not support this
|
||||
## type and loading a model with such a type would fail the modello validation.
|
||||
##
|
||||
#foreach ( $field in $model.getClass("Model", $version).allFields )
|
||||
#if ( $field.name == "pomFile" )
|
||||
#set ( $dummy = $field.setType("java.nio.file.Path") )
|
||||
#end
|
||||
#end
|
||||
#set ( $locationTracking = true )
|
||||
#
|
|
@ -1,380 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Merger" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.ObjectStreamException;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Objects;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.Name};
|
||||
#end
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
|
||||
/**
|
||||
* Merges the specified source object into the given target object.
|
||||
*
|
||||
* @param target The target object whose existing contents should be merged with the source, must not be
|
||||
* <code>null</code>.
|
||||
* @param source The (read-only) source object that should be merged into the target object, may be
|
||||
* <code>null</code>.
|
||||
* @param sourceDominant A flag indicating whether either the target object or the source object provides the
|
||||
* dominant data.
|
||||
* @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
|
||||
* information along, may be <code>null</code>.
|
||||
*/
|
||||
public ${root.name} merge( ${root.name} target, ${root.name} source, boolean sourceDominant, Map<?, ?> hints )
|
||||
{
|
||||
Objects.requireNonNull( target, "target cannot be null" );
|
||||
if ( source == null )
|
||||
{
|
||||
return target;
|
||||
}
|
||||
Map<Object, Object> context = new HashMap<>();
|
||||
if ( hints != null )
|
||||
{
|
||||
context.putAll( hints );
|
||||
}
|
||||
return merge${root.name}( target, source, sourceDominant, context );
|
||||
}
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
protected ${class.name} merge${class.name}( ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
${class.name}.Builder builder = ${class.name}.newBuilder( target );
|
||||
merge${class.name}( builder, target, source, sourceDominant, context );
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
protected void merge${class.name}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
merge${class.superClass}( builder, target ,source, sourceDominant, context );
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
merge${field.modelClass.name}_${Helper.capitalise($field.name)}( builder, target, source, sourceDominant, context );
|
||||
#end
|
||||
}
|
||||
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $capField = ${Helper.capitalise($field.name)} )
|
||||
protected void merge${class.name}_${capField}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
String src = source.get${capField}();
|
||||
String tgt = target.get${capField}();
|
||||
if ( src != null && ( sourceDominant || tgt == null ) )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, e -> e ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
Map<String, String> src = source.get${capField}();
|
||||
if ( !src.isEmpty() )
|
||||
{
|
||||
Map<String, String> tgt = target.get${capField}();
|
||||
if ( tgt.isEmpty() )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
Map<String, String> merged = new HashMap<>();
|
||||
merged.putAll( sourceDominant ? target.get${capField}() : source.get${capField}() );
|
||||
merged.putAll( sourceDominant ? source.get${capField}() : target.get${capField}() );
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
${field.to} src = source.get${capField}();
|
||||
if ( src != null )
|
||||
{
|
||||
${field.to} tgt = target.get${capField}();
|
||||
if ( tgt == null )
|
||||
{
|
||||
tgt = ${field.to}.newInstance( false );
|
||||
}
|
||||
${field.to} merged = merge${field.to}( tgt, src, sourceDominant, context );
|
||||
if ( merged == src )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else if ( merged != tgt )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, get${field.to}Key() ) );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
XmlNode src = source.getConfiguration();
|
||||
if ( src != null )
|
||||
{
|
||||
XmlNode tgt = target.getConfiguration();
|
||||
if ( tgt == null )
|
||||
{
|
||||
builder.configuration( src );
|
||||
}
|
||||
else if ( sourceDominant )
|
||||
{
|
||||
builder.configuration( src.merge( tgt ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.configuration( tgt.merge( src ) );
|
||||
}
|
||||
}
|
||||
#elseif ( $field.type == "boolean" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.is${capField}() );
|
||||
}
|
||||
#elseif ( $field.type == "int" || $field.type == "java.nio.file.Path" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.get${capField}() );
|
||||
}
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
}
|
||||
#end
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
protected KeyComputer<${class.name}> get${class.name}Key()
|
||||
{
|
||||
return v -> v;
|
||||
}
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Use to compute keys for data structures
|
||||
* @param <T> the data structure type
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface KeyComputer<T> extends Function<T, Object>
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two lists
|
||||
*/
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, boolean sourceDominant, KeyComputer<T> computer )
|
||||
{
|
||||
return merge( tgt, src, computer, ( t, s ) -> sourceDominant ? s : t );
|
||||
}
|
||||
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, KeyComputer<T> computer, BinaryOperator<T> remapping )
|
||||
{
|
||||
if ( src.isEmpty() )
|
||||
{
|
||||
return tgt;
|
||||
}
|
||||
|
||||
MergingList<T> list;
|
||||
if ( tgt instanceof MergingList )
|
||||
{
|
||||
list = (MergingList<T>) tgt;
|
||||
}
|
||||
else
|
||||
{
|
||||
list = new MergingList<>( computer, src.size() + tgt.size() );
|
||||
list.mergeAll( tgt, ( t, s ) -> s );
|
||||
}
|
||||
|
||||
list.mergeAll( src, remapping );
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merging list
|
||||
* @param <V>
|
||||
*/
|
||||
private static class MergingList<V> extends AbstractList<V> implements java.io.Serializable
|
||||
{
|
||||
|
||||
private final KeyComputer<V> keyComputer;
|
||||
private Map<Object, V> map;
|
||||
private List<V> list;
|
||||
|
||||
MergingList( KeyComputer<V> keyComputer, int initialCapacity )
|
||||
{
|
||||
this.map = new LinkedHashMap<>( initialCapacity );
|
||||
this.keyComputer = keyComputer;
|
||||
}
|
||||
|
||||
Object writeReplace() throws ObjectStreamException
|
||||
{
|
||||
return new ArrayList<>( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<V> iterator()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.values().iterator();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
void mergeAll( Collection<V> vs, BinaryOperator<V> remapping )
|
||||
{
|
||||
if ( map == null )
|
||||
{
|
||||
map = list.stream().collect( Collectors.toMap( keyComputer,
|
||||
Function.identity(),
|
||||
null,
|
||||
LinkedHashMap::new ) );
|
||||
|
||||
list = null;
|
||||
}
|
||||
|
||||
if ( vs instanceof MergingList && ( (MergingList<V>) vs ).map != null )
|
||||
{
|
||||
for ( Map.Entry<Object, V> e : ( (MergingList<V>) vs ).map.entrySet() )
|
||||
{
|
||||
Object key = e.getKey();
|
||||
V v = e.getValue();
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( V v : vs )
|
||||
{
|
||||
Object key = keyComputer.apply( v );
|
||||
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains( Object o )
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.containsValue( o );
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.contains( o );
|
||||
}
|
||||
}
|
||||
|
||||
private List<V> asList()
|
||||
{
|
||||
if ( list == null )
|
||||
{
|
||||
list = new ArrayList<>( map.values() );
|
||||
map = null;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add( int index, V element )
|
||||
{
|
||||
asList().add( index, element );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V remove( int index )
|
||||
{
|
||||
return asList().remove( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V get( int index )
|
||||
{
|
||||
return asList().get( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,331 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Writer" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
|
||||
#set ( $rootTag = $rootXml.tagName )
|
||||
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
|
||||
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
import org.apache.maven.internal.xml.XmlNodeBuilder;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.name};
|
||||
#end
|
||||
import org.codehaus.plexus.util.ReaderFactory;
|
||||
import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
|
||||
import org.codehaus.plexus.util.xml.pull.MXParser;
|
||||
import org.codehaus.plexus.util.xml.pull.MXSerializer;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
//--------------------------/
|
||||
//- Class/Member Variables -/
|
||||
//--------------------------/
|
||||
|
||||
/**
|
||||
* Field NAMESPACE.
|
||||
*/
|
||||
private static final String NAMESPACE = null;
|
||||
|
||||
/**
|
||||
* Field fileComment.
|
||||
*/
|
||||
private String fileComment = null;
|
||||
|
||||
|
||||
//-----------/
|
||||
//- Methods -/
|
||||
//-----------/
|
||||
|
||||
/**
|
||||
* Method setFileComment.
|
||||
*
|
||||
* @param fileComment a fileComment object.
|
||||
*/
|
||||
public void setFileComment( String fileComment )
|
||||
{
|
||||
this.fileComment = fileComment;
|
||||
} //-- void setFileComment( String )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param writer a writer object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any
|
||||
*/
|
||||
public void write( Writer writer, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( writer );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( Writer, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param stream a stream object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any
|
||||
*/
|
||||
public void write( OutputStream stream, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( stream, ${rootLcapName}.getModelEncoding() );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( OutputStream, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method writeDomToSerializer.
|
||||
*
|
||||
* @param dom a dom object.
|
||||
* @param serializer a serializer object.
|
||||
* @throws java.io.IOException java.io.IOException if any.
|
||||
*/
|
||||
protected void writeDomToSerializer( org.apache.maven.api.xml.XmlNode dom, XmlSerializer serializer )
|
||||
throws java.io.IOException
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
|
||||
for ( Map.Entry<String, String> attribute : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attribute.getKey(), attribute.getValue() );
|
||||
}
|
||||
for ( XmlNode aChild : dom.getChildren() )
|
||||
{
|
||||
writeDomToSerializer( aChild, serializer );
|
||||
}
|
||||
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
|
||||
} //-- void writeDomToSerializer( org.apache.maven.api.xml.XmlNode, XmlSerializer )
|
||||
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $classUcapName = $Helper.capitalise( $class.name ) )
|
||||
#set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
|
||||
#set ( $allFields = $Helper.xmlFields( $class ) )
|
||||
private void write${classUcapName}( String tagName, ${classUcapName} ${classLcapName}, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( ${classLcapName} != null )
|
||||
{
|
||||
#if ( $class == $root )
|
||||
if ( this.fileComment != null )
|
||||
{
|
||||
serializer.comment(this.fileComment);
|
||||
}
|
||||
serializer.setPrefix( "", "http://maven.apache.org/POM/4.0.0" );
|
||||
serializer.setPrefix( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
serializer.attribute( "", "xsi:schemaLocation", "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" );
|
||||
#else
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.xmlFieldMetadata( $field ).attribute )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#if ( $field.type == "String" )
|
||||
writeAttr( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#set ( $def = ${field.defaultValue} )
|
||||
#if ( $field.type == "String" )
|
||||
#if ( ! $def )
|
||||
writeTag( "$fieldTagName", null, ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
#if ( ${def} == "true" )
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? null : "false", serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? "true" : null, serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "int" )
|
||||
writeTag( "$fieldTagName", "${def}", Integer.toString( ${classLcapName}.get${fieldCapName}() ), serializer );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
writeDom( ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer, t -> writeTag( "$singularField", "${def}", t, serializer ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
writeProperties( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
write${field.to}( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", $Helper.isFlatItems($field), ${classLcapName}.get${fieldCapName}(), serializer, t -> write${field.to}( "$singularField", t, serializer ) );
|
||||
#else
|
||||
// TODO: name=${field.name} type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
@FunctionalInterface
|
||||
private interface ElementWriter<T>
|
||||
{
|
||||
public void write( T t ) throws IOException;
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
writeList( tagName, false, list, serializer, writer );
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, boolean flat, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
if ( list != null && !list.isEmpty() )
|
||||
{
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
}
|
||||
for ( T t : list )
|
||||
{
|
||||
writer.write( t );
|
||||
}
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private <T> void writeProperties( String tagName, Map<String, String> props, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( props != null && !props.isEmpty() )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
for ( Map.Entry<String, String> entry : props.entrySet() )
|
||||
{
|
||||
writeTag( entry.getKey(), null, entry.getValue(), serializer );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeDom( XmlNode dom, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( dom != null )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
for ( Map.Entry<String, String> attr : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attr.getKey(), attr.getValue() );
|
||||
}
|
||||
for ( XmlNode child : dom.getChildren() )
|
||||
{
|
||||
writeDom( child, serializer );
|
||||
}
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeTag( String tagName, String defaultValue, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null && !Objects.equals( defaultValue, value ) )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName ).text( value ).endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeAttr( String attrName, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attrName, value );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -60,6 +60,7 @@ under the License.
|
|||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<velocityBasedir>${project.basedir}/../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>src/main/mdo/lifecycle.mdo</model>
|
||||
</models>
|
||||
|
@ -74,9 +75,9 @@ under the License.
|
|||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<templates>
|
||||
<template>src/main/mdo/model.vm</template>
|
||||
<template>src/main/mdo/reader.vm</template>
|
||||
<template>src/main/mdo/writer.vm</template>
|
||||
<template>model.vm</template>
|
||||
<template>reader.vm</template>
|
||||
<template>writer.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV3=org.apache.maven.plugin.lifecycle</param>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
##
|
||||
## Nothing special to do here
|
||||
##
|
|
@ -1,380 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Merger" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.ObjectStreamException;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Objects;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.Name};
|
||||
#end
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
|
||||
/**
|
||||
* Merges the specified source object into the given target object.
|
||||
*
|
||||
* @param target The target object whose existing contents should be merged with the source, must not be
|
||||
* <code>null</code>.
|
||||
* @param source The (read-only) source object that should be merged into the target object, may be
|
||||
* <code>null</code>.
|
||||
* @param sourceDominant A flag indicating whether either the target object or the source object provides the
|
||||
* dominant data.
|
||||
* @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
|
||||
* information along, may be <code>null</code>.
|
||||
*/
|
||||
public ${root.name} merge( ${root.name} target, ${root.name} source, boolean sourceDominant, Map<?, ?> hints )
|
||||
{
|
||||
Objects.requireNonNull( target, "target cannot be null" );
|
||||
if ( source == null )
|
||||
{
|
||||
return target;
|
||||
}
|
||||
Map<Object, Object> context = new HashMap<>();
|
||||
if ( hints != null )
|
||||
{
|
||||
context.putAll( hints );
|
||||
}
|
||||
return merge${root.name}( target, source, sourceDominant, context );
|
||||
}
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
protected ${class.name} merge${class.name}( ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
${class.name}.Builder builder = ${class.name}.newBuilder( target );
|
||||
merge${class.name}( builder, target, source, sourceDominant, context );
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
protected void merge${class.name}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
merge${class.superClass}( builder, target ,source, sourceDominant, context );
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
merge${field.modelClass.name}_${Helper.capitalise($field.name)}( builder, target, source, sourceDominant, context );
|
||||
#end
|
||||
}
|
||||
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $capField = ${Helper.capitalise($field.name)} )
|
||||
protected void merge${class.name}_${capField}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
String src = source.get${capField}();
|
||||
String tgt = target.get${capField}();
|
||||
if ( src != null && ( sourceDominant || tgt == null ) )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, e -> e ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
Properties src = source.get${capField}();
|
||||
if ( !src.isEmpty() )
|
||||
{
|
||||
Properties tgt = target.get${capField}();
|
||||
if ( tgt.isEmpty() )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
Properties merged = new Properties();
|
||||
merged.putAll( sourceDominant ? target.get${capField}() : source.get${capField}() );
|
||||
merged.putAll( sourceDominant ? source.get${capField}() : target.get${capField}() );
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
${field.to} src = source.get${capField}();
|
||||
if ( src != null )
|
||||
{
|
||||
${field.to} tgt = target.get${capField}();
|
||||
if ( tgt == null )
|
||||
{
|
||||
tgt = ${field.to}.newInstance( false );
|
||||
}
|
||||
${field.to} merged = merge${field.to}( tgt, src, sourceDominant, context );
|
||||
if ( merged == src )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else if ( merged != tgt )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, get${field.to}Key() ) );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
XmlNode src = source.getConfiguration();
|
||||
if ( src != null )
|
||||
{
|
||||
XmlNode tgt = target.getConfiguration();
|
||||
if ( tgt == null )
|
||||
{
|
||||
builder.configuration( src );
|
||||
}
|
||||
else if ( sourceDominant )
|
||||
{
|
||||
builder.configuration( src.merge( tgt ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.configuration( tgt.merge( src ) );
|
||||
}
|
||||
}
|
||||
#elseif ( $field.type == "boolean" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.is${capField}() );
|
||||
}
|
||||
#elseif ( $field.type == "int" || $field.type == "java.nio.file.Path" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.get${capField}() );
|
||||
}
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
}
|
||||
#end
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
protected KeyComputer<${class.name}> get${class.name}Key()
|
||||
{
|
||||
return v -> v;
|
||||
}
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Use to compute keys for data structures
|
||||
* @param <T> the data structure type
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface KeyComputer<T> extends Function<T, Object>
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two lists
|
||||
*/
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, boolean sourceDominant, KeyComputer<T> computer )
|
||||
{
|
||||
return merge( tgt, src, computer, ( t, s ) -> sourceDominant ? s : t );
|
||||
}
|
||||
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, KeyComputer<T> computer, BinaryOperator<T> remapping )
|
||||
{
|
||||
if ( src.isEmpty() )
|
||||
{
|
||||
return tgt;
|
||||
}
|
||||
|
||||
MergingList<T> list;
|
||||
if ( tgt instanceof MergingList )
|
||||
{
|
||||
list = (MergingList<T>) tgt;
|
||||
}
|
||||
else
|
||||
{
|
||||
list = new MergingList<>( computer, src.size() + tgt.size() );
|
||||
list.mergeAll( tgt, ( t, s ) -> s );
|
||||
}
|
||||
|
||||
list.mergeAll( src, remapping );
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merging list
|
||||
* @param <V>
|
||||
*/
|
||||
private static class MergingList<V> extends AbstractList<V> implements java.io.Serializable
|
||||
{
|
||||
|
||||
private final KeyComputer<V> keyComputer;
|
||||
private Map<Object, V> map;
|
||||
private List<V> list;
|
||||
|
||||
MergingList( KeyComputer<V> keyComputer, int initialCapacity )
|
||||
{
|
||||
this.map = new LinkedHashMap<>( initialCapacity );
|
||||
this.keyComputer = keyComputer;
|
||||
}
|
||||
|
||||
Object writeReplace() throws ObjectStreamException
|
||||
{
|
||||
return new ArrayList<>( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<V> iterator()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.values().iterator();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
void mergeAll( Collection<V> vs, BinaryOperator<V> remapping )
|
||||
{
|
||||
if ( map == null )
|
||||
{
|
||||
map = list.stream().collect( Collectors.toMap( keyComputer,
|
||||
Function.identity(),
|
||||
null,
|
||||
LinkedHashMap::new ) );
|
||||
|
||||
list = null;
|
||||
}
|
||||
|
||||
if ( vs instanceof MergingList && ( (MergingList<V>) vs ).map != null )
|
||||
{
|
||||
for ( Map.Entry<Object, V> e : ( (MergingList<V>) vs ).map.entrySet() )
|
||||
{
|
||||
Object key = e.getKey();
|
||||
V v = e.getValue();
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( V v : vs )
|
||||
{
|
||||
Object key = keyComputer.apply( v );
|
||||
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains( Object o )
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.containsValue( o );
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.contains( o );
|
||||
}
|
||||
}
|
||||
|
||||
private List<V> asList()
|
||||
{
|
||||
if ( list == null )
|
||||
{
|
||||
list = new ArrayList<>( map.values() );
|
||||
map = null;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add( int index, V element )
|
||||
{
|
||||
asList().add( index, element );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V remove( int index )
|
||||
{
|
||||
return asList().remove( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V get( int index )
|
||||
{
|
||||
return asList().get( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,516 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV4}" )
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#set ( $inheritedFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#if ( $cl != $class )
|
||||
#set ( $dummy = $inheritedFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
#set ( $className = "${class.name}" )
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
#if ( $class.name != "InputLocation" && $class.name != "InputSource" )
|
||||
#set ( $types = { } )
|
||||
#set ( $imports = $class.getClass().forName("java.util.TreeSet").newInstance() )
|
||||
#set ( $dummy = $imports.add( "java.io.Serializable" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collections" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.HashMap" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Generated" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Immutable" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Nonnull" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.NotThreadSafe" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.ThreadSafe" ) )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.type == "java.util.List" )
|
||||
#set ( $dummy = $imports.add( "java.util.ArrayList" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collection" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.List" ) )
|
||||
#set ( $dummy = $types.put( $field, "List<" + $field.to + ">" ) )
|
||||
#elseif ( $field.type == "DOM" )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.xml.XmlNode" ) )
|
||||
#set ( $dummy = $types.put( $field, "XmlNode" ) )
|
||||
#else
|
||||
#set ( $fieldType = ${types.getOrDefault($field.type,$field.type)} )
|
||||
#set ( $idx = $fieldType.lastIndexOf('.') )
|
||||
#if ( $idx > 0 )
|
||||
#set ( $dummy = $imports.add( $fieldType ) )
|
||||
#set ( $dummy = $types.put( $fieldType, $fieldType.substring( $idx + 1 ) ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#set ( $eq = "" )
|
||||
#set ( $hc = "" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.identifier )
|
||||
#set ( $dummy = $imports.add( "java.util.Objects" ) )
|
||||
#set ( $dummy = $identifiers.add( $field ) )
|
||||
#if ( $eq == "" )
|
||||
#set ( $eq = "Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#else
|
||||
#set ( $eq = "$eq && Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#end
|
||||
#if ( $hc == "" )
|
||||
#set ( $hc = "${field.name}" )
|
||||
#else
|
||||
#set ( $hc = "$hc, this.${field.name}" )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
#foreach ( $imp in $imports )
|
||||
import $imp;
|
||||
#end
|
||||
|
||||
/**
|
||||
#foreach ( $line in ${class.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
@Generated @ThreadSafe @Immutable
|
||||
public class ${class.name}
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
implements Serializable, InputLocationTracker
|
||||
#else
|
||||
implements Serializable
|
||||
#end
|
||||
{
|
||||
#if ( $class == $root )
|
||||
final String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
/**
|
||||
#foreach ( $line in ${field.description.trim().split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
final ${type} $field.name;
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
/** Location of the xml element for this object. */
|
||||
final InputLocation location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
/** Location of the xml element for the field ${field.name}. */
|
||||
final InputLocation ${field.name}Location;
|
||||
#end
|
||||
#if ( ! $class.superClass )
|
||||
/** Other locations */
|
||||
final Map<Object, InputLocation> locations;
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Constructor for this class, package protected.
|
||||
* @see Builder#build()
|
||||
*/
|
||||
${class.name}(
|
||||
#if ( $class == $root )
|
||||
String modelEncoding,
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
$type $field.name${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations,
|
||||
InputLocation location,
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
InputLocation ${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
)
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super(
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}${sep}
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations,
|
||||
location,
|
||||
#foreach ( $field in $inheritedFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${inheritedFields[${inheritedFields.size()} - 1]}),#end" )
|
||||
${field.name}Location${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
this.modelEncoding = modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" || $field.type == "java.util.Map" )
|
||||
this.${field.name} = ImmutableCollections.copy( ${field.name} );
|
||||
#else
|
||||
this.${field.name} = ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
#if ( ! $class.superClass )
|
||||
this.locations = ImmutableCollections.copy( locations );
|
||||
this.location = location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name}Location = ${field.name}Location;
|
||||
#end
|
||||
#end
|
||||
}
|
||||
|
||||
#if ( ! $eq.empty )
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
if ( this == o )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ( o == null || !( o instanceof ${class.name} ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
${class.name} that = ( ${class.name} ) o;
|
||||
return ${eq};
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return Objects.hash( ${hc} );
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
public String getModelEncoding()
|
||||
{
|
||||
return modelEncoding;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type == "boolean" || $type == "Boolean" )
|
||||
#set ( $pfx = "is" )
|
||||
#else
|
||||
#set ( $pfx = "get" )
|
||||
#end
|
||||
/**
|
||||
#set ( $desc = ${field.description.trim()} )
|
||||
#foreach ( $line in ${desc.split("\n")} )
|
||||
* ${line.trim()}
|
||||
#end
|
||||
*/
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" )
|
||||
@Nonnull
|
||||
#end
|
||||
public ${type} ${pfx}${cap}()
|
||||
{
|
||||
return this.${field.name};
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
/**
|
||||
* Gets the location of the specified field in the input source.
|
||||
*/
|
||||
public InputLocation getLocation( Object key )
|
||||
{
|
||||
if ( key instanceof String )
|
||||
{
|
||||
switch ( ( String ) key )
|
||||
{
|
||||
#if ( ! $class.superClass )
|
||||
case "":
|
||||
return location;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
case "${field.name}":
|
||||
return ${field.name}Location;
|
||||
#end
|
||||
}
|
||||
}
|
||||
#if ( $class.superClass )
|
||||
return super.getLocation( key );
|
||||
#else
|
||||
return locations != null ? locations.get( key ) : null;
|
||||
#end
|
||||
}
|
||||
|
||||
#end
|
||||
/**
|
||||
* Creates a new builder with this object as the basis.
|
||||
*/
|
||||
@Nonnull
|
||||
public Builder with()
|
||||
{
|
||||
return newBuilder( this );
|
||||
}
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
/** Creates a new ${class.name} instance using the specified ${field.name}. */
|
||||
@Nonnull
|
||||
public ${class.name} with${cap}( $type $field.name )
|
||||
{
|
||||
return with().${field.name}( $field.name ).build();
|
||||
}
|
||||
#end
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} instance.
|
||||
* Equivalent to {@code newInstance( true )}.
|
||||
* @see #newInstance(boolean)
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance()
|
||||
{
|
||||
return newInstance( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} instance using default values or not.
|
||||
* Equivalent to {@code newBuilder( withDefaults ).build()}.
|
||||
*/
|
||||
@Nonnull
|
||||
public static ${class.name} newInstance( boolean withDefaults )
|
||||
{
|
||||
return newBuilder( withDefaults ).build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} builder instance.
|
||||
* Equivalent to {@code newBuilder( true )}.
|
||||
* @see #newBuilder(boolean)
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder()
|
||||
{
|
||||
return newBuilder( true );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} builder instance using default values or not.
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( boolean withDefaults )
|
||||
{
|
||||
return new Builder( withDefaults );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} builder instance using the specified object as a basis.
|
||||
* Equivalent to {@code newBuilder( from, false )}.
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from )
|
||||
{
|
||||
return newBuilder( from, false );
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new ${class.name} builder instance using the specified object as a basis.
|
||||
*/
|
||||
@Nonnull
|
||||
public static Builder newBuilder( ${class.name} from, boolean forceCopy )
|
||||
{
|
||||
return new Builder( from, forceCopy );
|
||||
}
|
||||
|
||||
/**
|
||||
* Builder class used to create ${class.name} instances.
|
||||
* @see #with()
|
||||
* @see #newBuilder()
|
||||
*/
|
||||
@NotThreadSafe
|
||||
public static class Builder
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}.Builder
|
||||
#end
|
||||
{
|
||||
${class.name} base;
|
||||
#if ( $class == $root )
|
||||
String modelEncoding;
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
#if ( $type == 'boolean' )
|
||||
Boolean ${field.name};
|
||||
#elseif ( $type == 'int' )
|
||||
Integer ${field.name};
|
||||
#else
|
||||
${type} ${field.name};
|
||||
#end
|
||||
#end
|
||||
#if ( ! $class.superClass && $locationTracking )
|
||||
Map<Object, InputLocation> locations;
|
||||
#end
|
||||
|
||||
Builder( boolean withDefaults )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( withDefaults );
|
||||
#end
|
||||
if ( withDefaults )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#if ( $field.defaultValue )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $field.type == "String" )
|
||||
this.${field.name} = "${field.defaultValue}";
|
||||
#elseif ( $field.type != "java.util.List" && $field.type != "java.util.Properties" )
|
||||
this.${field.name} = ${field.defaultValue};
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
}
|
||||
}
|
||||
|
||||
Builder( ${class.name} base, boolean forceCopy )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( base, forceCopy );
|
||||
#end
|
||||
if ( forceCopy )
|
||||
{
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
this.${field.name} = base.${field.name};
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
this.base = base;
|
||||
}
|
||||
}
|
||||
|
||||
#if ( $class == $root )
|
||||
@Nonnull
|
||||
public Builder modelEncoding( String modelEncoding )
|
||||
{
|
||||
this.modelEncoding = modelEncoding;
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type.startsWith("List<") )
|
||||
#set ( $type = ${type.replace('List<','Collection<')} )
|
||||
#end
|
||||
@Nonnull
|
||||
public Builder ${field.name}( ${type} ${field.name} )
|
||||
{
|
||||
this.${field.name} = ${field.name};
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
|
||||
#if ( $locationTracking )
|
||||
@Nonnull
|
||||
public Builder location( Object key, InputLocation location )
|
||||
{
|
||||
if ( location != null )
|
||||
{
|
||||
if ( this.locations == null )
|
||||
{
|
||||
this.locations = new HashMap<>();
|
||||
}
|
||||
this.locations.put( key, location );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
#end
|
||||
@Nonnull
|
||||
public ${class.name} build()
|
||||
{
|
||||
if ( base != null
|
||||
#foreach ( $field in $allFields )
|
||||
&& ( ${field.name} == null || ${field.name} == base.${field.name} )
|
||||
#end
|
||||
)
|
||||
{
|
||||
return base;
|
||||
}
|
||||
#if ( $locationTracking )
|
||||
Map<Object, InputLocation> locations = new HashMap<>( this.locations != null ? this.locations : ( base != null ? base.locations : Collections.emptyMap() ) );
|
||||
InputLocation location = locations.remove( "" );
|
||||
#foreach ( $field in $allFields )
|
||||
InputLocation ${field.name}Location = locations.remove( "${field.name}" );
|
||||
#end
|
||||
#end
|
||||
return new ${class.name}(
|
||||
#if ( $class == $root )
|
||||
modelEncoding != null ? modelEncoding : ( base != null ? base.modelEncoding : "UTF-8" ),
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}||$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
#if ( $field.type == "boolean" || $field.type == "int" )
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : ${field.defaultValue} )${sep}
|
||||
#else
|
||||
${field.name} != null ? ${field.name} : ( base != null ? base.${field.name} : null )${sep}
|
||||
#end
|
||||
#end
|
||||
#if ( $locationTracking )
|
||||
locations,
|
||||
location != null ? location : ( base != null ? base.location : null ),
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $sep = "#if(${locationTracking}&&$field!=${allFields[${allFields.size()} - 1]}),#end" )
|
||||
${field.name}Location != null ? ${field.name}Location : ( base != null ? base.${field.name}Location : null )${sep}
|
||||
#end
|
||||
#end
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
#foreach ( $cs in $class.getCodeSegments($version) )
|
||||
$cs.code
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
|
@ -1,899 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Reader" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
|
||||
#set ( $rootTag = $rootXml.tagName )
|
||||
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
|
||||
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.internal.xml.XmlNodeBuilder;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.name};
|
||||
#end
|
||||
import org.codehaus.plexus.util.ReaderFactory;
|
||||
import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
|
||||
import org.codehaus.plexus.util.xml.pull.MXParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
private boolean addDefaultEntities = true;
|
||||
|
||||
private final ContentTransformer contentTransformer;
|
||||
|
||||
public ${className}()
|
||||
{
|
||||
this( ( s, f ) -> s );
|
||||
}
|
||||
|
||||
public ${className}( ContentTransformer contentTransformer )
|
||||
{
|
||||
this.contentTransformer = contentTransformer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method checkFieldWithDuplicate.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param parsed a parsed object.
|
||||
* @param alias a alias object.
|
||||
* @param tagName a tagName object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, Set<String> parsed )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( !parsed.add( tagName ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
|
||||
}
|
||||
return true;
|
||||
} //-- boolean checkFieldWithDuplicate( XmlPullParser, String, String, Set<String> )
|
||||
|
||||
/**
|
||||
* Method checkUnknownAttribute.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @param tagName a tagName object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @throws IOException IOException if any.
|
||||
*/
|
||||
private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
|
||||
throws XmlPullParserException, IOException
|
||||
{
|
||||
// strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
|
||||
}
|
||||
} //-- void checkUnknownAttribute( XmlPullParser, String, String, boolean )
|
||||
|
||||
/**
|
||||
* Method checkUnknownElement.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @throws IOException IOException if any.
|
||||
*/
|
||||
private void checkUnknownElement( XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException, IOException
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
|
||||
}
|
||||
|
||||
for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
|
||||
{
|
||||
int eventType = parser.next();
|
||||
if ( eventType == XmlPullParser.START_TAG )
|
||||
{
|
||||
unrecognizedTagCount++;
|
||||
}
|
||||
else if ( eventType == XmlPullParser.END_TAG )
|
||||
{
|
||||
unrecognizedTagCount--;
|
||||
}
|
||||
}
|
||||
} //-- void checkUnknownElement( XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Returns the state of the "add default entities" flag.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean getAddDefaultEntities()
|
||||
{
|
||||
return addDefaultEntities;
|
||||
} //-- boolean getAddDefaultEntities()
|
||||
|
||||
/**
|
||||
* Method getBooleanValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getBooleanValue( s, attribute, parser, null );
|
||||
} //-- boolean getBooleanValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getBooleanValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param defaultValue a defaultValue object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null && s.length() != 0 )
|
||||
{
|
||||
return Boolean.valueOf( s ).booleanValue();
|
||||
}
|
||||
if ( defaultValue != null )
|
||||
{
|
||||
return Boolean.valueOf( defaultValue ).booleanValue();
|
||||
}
|
||||
return false;
|
||||
} //-- boolean getBooleanValue( String, String, XmlPullParser, String )
|
||||
|
||||
/**
|
||||
* Method getByteValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return byte
|
||||
*/
|
||||
private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Byte.valueOf( s ).byteValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- byte getByteValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getCharacterValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return char
|
||||
*/
|
||||
private char getCharacterValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
return s.charAt( 0 );
|
||||
}
|
||||
return 0;
|
||||
} //-- char getCharacterValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDateValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return Date
|
||||
*/
|
||||
private Date getDateValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getDateValue( s, attribute, null, parser );
|
||||
} //-- Date getDateValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDateValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param dateFormat a dateFormat object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return Date
|
||||
*/
|
||||
private Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
String effectiveDateFormat = dateFormat;
|
||||
if ( dateFormat == null )
|
||||
{
|
||||
effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
|
||||
}
|
||||
if ( "long".equals( effectiveDateFormat ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new java.util.Date( Long.parseLong( s ) );
|
||||
}
|
||||
catch ( NumberFormatException e )
|
||||
{
|
||||
throw new XmlPullParserException( e.getMessage(), parser, e );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
|
||||
return dateParser.parse( s );
|
||||
}
|
||||
catch ( java.text.ParseException e )
|
||||
{
|
||||
throw new XmlPullParserException( e.getMessage(), parser, e );
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} //-- Date getDateValue( String, String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDoubleValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return double
|
||||
*/
|
||||
private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Double.valueOf( s ).doubleValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- double getDoubleValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getFloatValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return float
|
||||
*/
|
||||
private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Float.valueOf( s ).floatValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- float getFloatValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getIntegerValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getIntegerValue( s, attribute, parser, strict, 0 );
|
||||
} //-- int getBooleanValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getIntegerValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict, int defaultValue )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Integer.valueOf( s ).intValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
} //-- int getIntegerValue( String, String, XmlPullParser, boolean, int )
|
||||
|
||||
/**
|
||||
* Method getLongValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return long
|
||||
*/
|
||||
private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Long.valueOf( s ).longValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- long getLongValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getRequiredAttributeValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return String
|
||||
*/
|
||||
private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s == null )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
|
||||
}
|
||||
}
|
||||
return s;
|
||||
} //-- String getRequiredAttributeValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getShortValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return short
|
||||
*/
|
||||
private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Short.valueOf( s ).shortValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- short getShortValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getTrimmedValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @return String
|
||||
*/
|
||||
private String getTrimmedValue( String s )
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
s = s.trim();
|
||||
}
|
||||
return s;
|
||||
} //-- String getTrimmedValue( String )
|
||||
|
||||
/**
|
||||
* Method interpolatedTrimmed.
|
||||
*
|
||||
* @param value a value object.
|
||||
* @param context a context object.
|
||||
* @return String
|
||||
*/
|
||||
private String interpolatedTrimmed( String value, String context )
|
||||
{
|
||||
return getTrimmedValue( contentTransformer.transform( value, context ) );
|
||||
} //-- String interpolatedTrimmed( String, String )
|
||||
|
||||
/**
|
||||
* Method nextTag.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int nextTag( XmlPullParser parser )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
int eventType = parser.next();
|
||||
if ( eventType == XmlPullParser.TEXT )
|
||||
{
|
||||
eventType = parser.next();
|
||||
}
|
||||
if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
|
||||
{
|
||||
throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
|
||||
}
|
||||
return eventType;
|
||||
} //-- int nextTag( XmlPullParser )
|
||||
|
||||
/**
|
||||
* @see ReaderFactory#newXmlReader
|
||||
*
|
||||
* @param reader a reader object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( Reader reader, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
|
||||
|
||||
parser.setInput( reader );
|
||||
|
||||
|
||||
return read( parser, strict );
|
||||
} //-- ${root.name} read( Reader, boolean )
|
||||
|
||||
/**
|
||||
* @see ReaderFactory#newXmlReader
|
||||
*
|
||||
* @param reader a reader object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( Reader reader )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( reader, true );
|
||||
} //-- ${root.name} read( Reader )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param in a in object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( InputStream in, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( ReaderFactory.newXmlReader( in ), strict );
|
||||
} //-- ${root.name} read( InputStream, boolean )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param in a in object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( InputStream in )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( ReaderFactory.newXmlReader( in ) );
|
||||
} //-- ${root.name} read( InputStream )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( XmlPullParser parser, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
$rootUcapName $rootLcapName = null;
|
||||
int eventType = parser.getEventType();
|
||||
boolean parsed = false;
|
||||
while ( eventType != XmlPullParser.END_DOCUMENT )
|
||||
{
|
||||
if ( eventType == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( strict && ! "${rootTag}".equals( parser.getName() ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Expected root element '${rootTag}' but found '" + parser.getName() + "'", parser, null );
|
||||
}
|
||||
else if ( parsed )
|
||||
{
|
||||
// fallback, already expected a XmlPullParserException due to invalid XML
|
||||
throw new XmlPullParserException( "Duplicated tag: '${rootTag}'", parser, null );
|
||||
}
|
||||
$rootLcapName = parse${rootUcapName}( parser, strict );
|
||||
parsed = true;
|
||||
}
|
||||
eventType = parser.next();
|
||||
}
|
||||
if ( parsed )
|
||||
{
|
||||
return $rootLcapName;
|
||||
}
|
||||
throw new XmlPullParserException( "Expected root element '${rootTag}' but found no element at all: invalid XML document", parser, null );
|
||||
} //-- ${root.name} read( XmlPullParser, boolean )
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $classUcapName = $Helper.capitalise( $class.name ) )
|
||||
#set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
private ${classUcapName} parse${classUcapName}( XmlPullParser parser, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
String tagName = parser.getName();
|
||||
${classUcapName}.Builder ${classLcapName} = ${classUcapName}.newBuilder( true );
|
||||
for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
|
||||
{
|
||||
String name = parser.getAttributeName( i );
|
||||
String value = parser.getAttributeValue( i );
|
||||
if ( name.indexOf( ':' ) >= 0 )
|
||||
{
|
||||
// just ignore attributes with non-default namespace (for example: xmlns:xsi)
|
||||
}
|
||||
#if ( $class == $root )
|
||||
else if ( "xmlns".equals( name ) )
|
||||
{
|
||||
// ignore xmlns attribute in root class, which is a reserved attribute name
|
||||
}
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.xmlFieldMetadata( $field ).attribute )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
else if ( "$fieldTagName".equals( name ) )
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
${classLcapName}.${field.name}( interpolatedTrimmed( value, "$fieldTagName" ) );
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
${classLcapName}.${field.name}( getBooleanValue( interpolatedTrimmed( value, "$fieldTagName" ), "$fieldTagName", parser, "${field.defaultValue}" ) );
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
||||
else
|
||||
{
|
||||
checkUnknownAttribute( parser, name, tagName, strict );
|
||||
}
|
||||
}
|
||||
Set<String> parsed = new HashSet<>();
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
List<$field.to> ${field.name} = new ArrayList<>();
|
||||
#end
|
||||
#end
|
||||
while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
|
||||
{
|
||||
String childName = checkDuplicate( parser.getName(), parser, parsed );
|
||||
switch ( childName )
|
||||
{
|
||||
#set( $ift = "if" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
#set ( $fieldTagName = $Helper.singular( $fieldTagName ) )
|
||||
#end
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
case "${fieldTagName}":
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
${classLcapName}.${field.name}( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ) );
|
||||
break;
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
${classLcapName}.${field.name}( getBooleanValue( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ), "${fieldTagName}", parser, "${field.defaultValue}" ) );
|
||||
break;
|
||||
#elseif ( $field.type == "int" )
|
||||
${classLcapName}.${field.name}( getIntegerValue( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ), "${fieldTagName}", parser, strict, ${field.defaultValue} ) );
|
||||
break;
|
||||
#elseif ( $field.type == "DOM" )
|
||||
${classLcapName}.${field.name}( XmlNodeBuilder.build( parser, true ) );
|
||||
break;
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
List<String> ${field.name} = new ArrayList<>();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( "${Helper.singular($fieldTagName)}".equals( parser.getName() ) )
|
||||
{
|
||||
${field.name}.add( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
}
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
Properties ${field.name} = new Properties();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
String key = parser.getName();
|
||||
String value = parser.nextText().trim();
|
||||
${field.name}.put( key, value );
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
${classLcapName}.${field.name}( parse${field.toClass.name}( parser, strict ) );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "*" && $Helper.isFlatItems( $field ) )
|
||||
${field.name}.add( parse${field.toClass.name}( parser, strict ) );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
List<$field.to> ${field.name} = new ArrayList<>();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( "${Helper.singular($fieldTagName)}".equals( parser.getName() ) )
|
||||
{
|
||||
${field.name}.add( parse${field.toClass.name}( parser, strict ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
}
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
break;
|
||||
#end
|
||||
}
|
||||
#set( $ift = "else if" )
|
||||
#end
|
||||
#end
|
||||
default:
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
#end
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
${classLcapName}.modelEncoding( parser.getInputEncoding() );
|
||||
#end
|
||||
return ${classLcapName}.build();
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
private String checkDuplicate( String tagName, XmlPullParser parser, Set<String> parsed )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
#set( $aliases = { } )
|
||||
#set( $flats = { } )
|
||||
#foreach( $class in $model.allClasses )
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#if ( $field.alias )
|
||||
#set ( $dummy = $aliases.put( $field.alias, $fieldTagName ) )
|
||||
#end
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
#set ( $fieldTagName = $Helper.singular($fieldTagName) )
|
||||
#set ( $dummy = $flats.put( $fieldTagName, "" ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#if ( ! ${aliases.isEmpty()} )
|
||||
switch ( tagName )
|
||||
{
|
||||
#foreach( $entry in $aliases.entrySet() )
|
||||
case "${entry.key}":
|
||||
tagName = "${entry.value}";
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#if ( ! ${flats.isEmpty()} )
|
||||
switch ( tagName )
|
||||
{
|
||||
#foreach( $entry in $flats.entrySet() )
|
||||
case "${entry.key}":
|
||||
#end
|
||||
break;
|
||||
default:
|
||||
if ( !parsed.add( tagName ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
|
||||
}
|
||||
}
|
||||
#end
|
||||
return tagName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the state of the "add default entities" flag.
|
||||
*
|
||||
* @param addDefaultEntities a addDefaultEntities object.
|
||||
*/
|
||||
public void setAddDefaultEntities( boolean addDefaultEntities )
|
||||
{
|
||||
this.addDefaultEntities = addDefaultEntities;
|
||||
} //-- void setAddDefaultEntities( boolean )
|
||||
|
||||
public static interface ContentTransformer
|
||||
{
|
||||
/**
|
||||
* Interpolate the value read from the xpp3 document
|
||||
* @param source The source value
|
||||
* @param fieldName A description of the field being interpolated. The implementation may use this to
|
||||
* log stuff.
|
||||
* @return The interpolated value.
|
||||
*/
|
||||
String transform( String source, String fieldName );
|
||||
}
|
||||
|
||||
}
|
|
@ -1,331 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Writer" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
|
||||
#set ( $rootTag = $rootXml.tagName )
|
||||
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
|
||||
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
import org.apache.maven.internal.xml.XmlNodeBuilder;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.name};
|
||||
#end
|
||||
import org.codehaus.plexus.util.ReaderFactory;
|
||||
import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
|
||||
import org.codehaus.plexus.util.xml.pull.MXParser;
|
||||
import org.codehaus.plexus.util.xml.pull.MXSerializer;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
//--------------------------/
|
||||
//- Class/Member Variables -/
|
||||
//--------------------------/
|
||||
|
||||
/**
|
||||
* Field NAMESPACE.
|
||||
*/
|
||||
private static final String NAMESPACE = null;
|
||||
|
||||
/**
|
||||
* Field fileComment.
|
||||
*/
|
||||
private String fileComment = null;
|
||||
|
||||
|
||||
//-----------/
|
||||
//- Methods -/
|
||||
//-----------/
|
||||
|
||||
/**
|
||||
* Method setFileComment.
|
||||
*
|
||||
* @param fileComment a fileComment object.
|
||||
*/
|
||||
public void setFileComment( String fileComment )
|
||||
{
|
||||
this.fileComment = fileComment;
|
||||
} //-- void setFileComment( String )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param writer a writer object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any.
|
||||
*/
|
||||
public void write( Writer writer, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( writer );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( Writer, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param stream a stream object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any.
|
||||
*/
|
||||
public void write( OutputStream stream, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( stream, ${rootLcapName}.getModelEncoding() );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( OutputStream, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method writeDomToSerializer.
|
||||
*
|
||||
* @param dom a dom object.
|
||||
* @param serializer a serializer object.
|
||||
* @throws java.io.IOException java.io.IOException if any.
|
||||
*/
|
||||
protected void writeDomToSerializer( org.apache.maven.api.xml.XmlNode dom, XmlSerializer serializer )
|
||||
throws java.io.IOException
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
|
||||
for ( Map.Entry<String, String> attribute : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attribute.getKey(), attribute.getValue() );
|
||||
}
|
||||
for ( XmlNode aChild : dom.getChildren() )
|
||||
{
|
||||
writeDomToSerializer( aChild, serializer );
|
||||
}
|
||||
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
|
||||
} //-- void writeDomToSerializer( org.apache.maven.api.xml.XmlNode, XmlSerializer )
|
||||
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $classUcapName = $Helper.capitalise( $class.name ) )
|
||||
#set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
|
||||
#set ( $allFields = $Helper.xmlFields( $class ) )
|
||||
private void write${classUcapName}( String tagName, ${classUcapName} ${classLcapName}, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( ${classLcapName} != null )
|
||||
{
|
||||
#if ( $class == $root )
|
||||
if ( this.fileComment != null )
|
||||
{
|
||||
serializer.comment(this.fileComment);
|
||||
}
|
||||
serializer.setPrefix( "", "http://maven.apache.org/POM/4.0.0" );
|
||||
serializer.setPrefix( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
serializer.attribute( "", "xsi:schemaLocation", "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" );
|
||||
#else
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.xmlFieldMetadata( $field ).attribute )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#if ( $field.type == "String" )
|
||||
writeAttr( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#set ( $def = ${field.defaultValue} )
|
||||
#if ( $field.type == "String" )
|
||||
#if ( ! $def )
|
||||
writeTag( "$fieldTagName", null, ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
#if ( ${def} == "true" )
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? null : "false", serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? "true" : null, serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "int" )
|
||||
writeTag( "$fieldTagName", "${def}", Integer.toString( ${classLcapName}.get${fieldCapName}() ), serializer );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
writeDom( ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer, t -> writeTag( "$singularField", "${def}", t, serializer ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
writeProperties( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
write${field.to}( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", $Helper.isFlatItems($field), ${classLcapName}.get${fieldCapName}(), serializer, t -> write${field.to}( "$singularField", t, serializer ) );
|
||||
#else
|
||||
// TODO: name=${field.name} type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
@FunctionalInterface
|
||||
private interface ElementWriter<T>
|
||||
{
|
||||
public void write( T t ) throws IOException;
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
writeList( tagName, false, list, serializer, writer );
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, boolean flat, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
if ( list != null && !list.isEmpty() )
|
||||
{
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
}
|
||||
for ( T t : list )
|
||||
{
|
||||
writer.write( t );
|
||||
}
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private <T> void writeProperties( String tagName, Properties props, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( props != null && !props.isEmpty() )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
for ( Map.Entry<Object, Object> entry : props.entrySet() )
|
||||
{
|
||||
writeTag( entry.getKey().toString(), null, entry.getValue().toString(), serializer );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeDom( XmlNode dom, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( dom != null )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
for ( Map.Entry<String, String> attr : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attr.getKey(), attr.getValue() );
|
||||
}
|
||||
for ( XmlNode child : dom.getChildren() )
|
||||
{
|
||||
writeDom( child, serializer );
|
||||
}
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeTag( String tagName, String defaultValue, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null && !Objects.equals( defaultValue, value ) )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName ).text( value ).endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeAttr( String attrName, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attrName, value );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -50,38 +50,15 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-settings.mdo</id>
|
||||
<goals>
|
||||
<goal>copy</goal>
|
||||
</goals>
|
||||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<artifactItems>
|
||||
<artifactItem>
|
||||
<groupId>org.apache.maven</groupId>
|
||||
<artifactId>maven-api-settings</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>mdo</type>
|
||||
<outputDirectory>target/mdo/</outputDirectory>
|
||||
<destFileName>settings.mdo</destFileName>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<version>2.0.0</version>
|
||||
<basedir>${project.basedir}/../api/maven-api-settings</basedir>
|
||||
<velocityBasedir>${project.basedir}/../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>target/mdo/settings.mdo</model>
|
||||
<model>src/main/mdo/settings.mdo</model>
|
||||
</models>
|
||||
</configuration>
|
||||
<executions>
|
||||
|
@ -93,10 +70,10 @@ under the License.
|
|||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<templates>
|
||||
<template>src/main/mdo/model-v3.vm</template>
|
||||
<template>src/main/mdo/merger.vm</template>
|
||||
<template>src/main/mdo/reader.vm</template>
|
||||
<template>src/main/mdo/writer.vm</template>
|
||||
<template>model-v3.vm</template>
|
||||
<template>merger.vm</template>
|
||||
<template>reader.vm</template>
|
||||
<template>writer.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV3=org.apache.maven.settings</param>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
##
|
||||
## Nothing special to do here
|
||||
##
|
|
@ -1,331 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Writer" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
|
||||
#set ( $rootTag = $rootXml.tagName )
|
||||
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
|
||||
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.Reader;
|
||||
import java.io.Writer;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
import org.apache.maven.internal.xml.XmlNodeBuilder;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.name};
|
||||
#end
|
||||
import org.codehaus.plexus.util.ReaderFactory;
|
||||
import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
|
||||
import org.codehaus.plexus.util.xml.pull.MXParser;
|
||||
import org.codehaus.plexus.util.xml.pull.MXSerializer;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlSerializer;
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
//--------------------------/
|
||||
//- Class/Member Variables -/
|
||||
//--------------------------/
|
||||
|
||||
/**
|
||||
* Field NAMESPACE.
|
||||
*/
|
||||
private static final String NAMESPACE = null;
|
||||
|
||||
/**
|
||||
* Field fileComment.
|
||||
*/
|
||||
private String fileComment = null;
|
||||
|
||||
|
||||
//-----------/
|
||||
//- Methods -/
|
||||
//-----------/
|
||||
|
||||
/**
|
||||
* Method setFileComment.
|
||||
*
|
||||
* @param fileComment a fileComment object.
|
||||
*/
|
||||
public void setFileComment( String fileComment )
|
||||
{
|
||||
this.fileComment = fileComment;
|
||||
} //-- void setFileComment( String )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param writer a writer object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any
|
||||
*/
|
||||
public void write( Writer writer, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( writer );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( Writer, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method write.
|
||||
*
|
||||
* @param stream a stream object
|
||||
* @param ${rootLcapName} a ${root.name} object
|
||||
* @throws java.io.IOException java.io.IOException if any
|
||||
*/
|
||||
public void write( OutputStream stream, ${root.name} ${rootLcapName} )
|
||||
throws java.io.IOException
|
||||
{
|
||||
XmlSerializer serializer = new MXSerializer();
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-indentation", " " );
|
||||
serializer.setProperty( "http://xmlpull.org/v1/doc/properties.html#serializer-line-separator", "\n" );
|
||||
serializer.setOutput( stream, ${rootLcapName}.getModelEncoding() );
|
||||
serializer.startDocument( ${rootLcapName}.getModelEncoding(), null );
|
||||
write${root.name}( "$rootTag", ${rootLcapName}, serializer );
|
||||
serializer.endDocument();
|
||||
} //-- void write( OutputStream, ${root.name} )
|
||||
|
||||
/**
|
||||
* Method writeDomToSerializer.
|
||||
*
|
||||
* @param dom a dom object.
|
||||
* @param serializer a serializer object.
|
||||
* @throws java.io.IOException java.io.IOException if any.
|
||||
*/
|
||||
protected void writeDomToSerializer( org.apache.maven.api.xml.XmlNode dom, XmlSerializer serializer )
|
||||
throws java.io.IOException
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
|
||||
for ( Map.Entry<String, String> attribute : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attribute.getKey(), attribute.getValue() );
|
||||
}
|
||||
for ( XmlNode aChild : dom.getChildren() )
|
||||
{
|
||||
writeDomToSerializer( aChild, serializer );
|
||||
}
|
||||
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
|
||||
} //-- void writeDomToSerializer( org.apache.maven.api.xml.XmlNode, XmlSerializer )
|
||||
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $classUcapName = $Helper.capitalise( $class.name ) )
|
||||
#set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
|
||||
#set ( $allFields = $Helper.xmlFields( $class ) )
|
||||
private void write${classUcapName}( String tagName, ${classUcapName} ${classLcapName}, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( ${classLcapName} != null )
|
||||
{
|
||||
#if ( $class == $root )
|
||||
if ( this.fileComment != null )
|
||||
{
|
||||
serializer.comment(this.fileComment);
|
||||
}
|
||||
serializer.setPrefix( "", "http://maven.apache.org/POM/4.0.0" );
|
||||
serializer.setPrefix( "xsi", "http://www.w3.org/2001/XMLSchema-instance" );
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
serializer.attribute( "", "xsi:schemaLocation", "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" );
|
||||
#else
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.xmlFieldMetadata( $field ).attribute )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#if ( $field.type == "String" )
|
||||
writeAttr( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
#set ( $def = ${field.defaultValue} )
|
||||
#if ( $field.type == "String" )
|
||||
#if ( ! $def )
|
||||
writeTag( "$fieldTagName", null, ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
#if ( ${def} == "true" )
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? null : "false", serializer );
|
||||
#else
|
||||
writeTag( "$fieldTagName", "${def}", ${classLcapName}.is${fieldCapName}() ? "true" : null, serializer );
|
||||
#end
|
||||
#elseif ( $field.type == "int" )
|
||||
writeTag( "$fieldTagName", "${def}", Integer.toString( ${classLcapName}.get${fieldCapName}() ), serializer );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
writeDom( ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer, t -> writeTag( "$singularField", "${def}", t, serializer ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
writeProperties( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
write${field.to}( "$fieldTagName", ${classLcapName}.get${fieldCapName}(), serializer );
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
#set( $singularField = ${Helper.singular($fieldTagName)} )
|
||||
writeList( "$fieldTagName", $Helper.isFlatItems($field), ${classLcapName}.get${fieldCapName}(), serializer, t -> write${field.to}( "$singularField", t, serializer ) );
|
||||
#else
|
||||
// TODO: name=${field.name} type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
@FunctionalInterface
|
||||
private interface ElementWriter<T>
|
||||
{
|
||||
public void write( T t ) throws IOException;
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
writeList( tagName, false, list, serializer, writer );
|
||||
}
|
||||
|
||||
private <T> void writeList( String tagName, boolean flat, List<T> list, XmlSerializer serializer, ElementWriter<T> writer )
|
||||
throws IOException
|
||||
{
|
||||
if ( list != null && !list.isEmpty() )
|
||||
{
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
}
|
||||
for ( T t : list )
|
||||
{
|
||||
writer.write( t );
|
||||
}
|
||||
if ( !flat )
|
||||
{
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private <T> void writeProperties( String tagName, Map<String, String> props, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( props != null && !props.isEmpty() )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName );
|
||||
for ( Map.Entry<String, String> entry : props.entrySet() )
|
||||
{
|
||||
writeTag( entry.getKey(), null, entry.getValue(), serializer );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeDom( XmlNode dom, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( dom != null )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, dom.getName() );
|
||||
for ( Map.Entry<String, String> attr : dom.getAttributes().entrySet() )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attr.getKey(), attr.getValue() );
|
||||
}
|
||||
for ( XmlNode child : dom.getChildren() )
|
||||
{
|
||||
writeDom( child, serializer );
|
||||
}
|
||||
String value = dom.getValue();
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.text( value );
|
||||
}
|
||||
serializer.endTag( NAMESPACE, dom.getName() );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeTag( String tagName, String defaultValue, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null && !Objects.equals( defaultValue, value ) )
|
||||
{
|
||||
serializer.startTag( NAMESPACE, tagName ).text( value ).endTag( NAMESPACE, tagName );
|
||||
}
|
||||
}
|
||||
|
||||
private void writeAttr( String attrName, String value, XmlSerializer serializer )
|
||||
throws IOException
|
||||
{
|
||||
if ( value != null )
|
||||
{
|
||||
serializer.attribute( NAMESPACE, attrName, value );
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -49,38 +49,15 @@ under the License.
|
|||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>copy-toolchains.mdo</id>
|
||||
<goals>
|
||||
<goal>copy</goal>
|
||||
</goals>
|
||||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<artifactItems>
|
||||
<artifactItem>
|
||||
<groupId>org.apache.maven</groupId>
|
||||
<artifactId>maven-api-toolchain</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<type>mdo</type>
|
||||
<outputDirectory>target/mdo/</outputDirectory>
|
||||
<destFileName>toolchains.mdo</destFileName>
|
||||
</artifactItem>
|
||||
</artifactItems>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<configuration>
|
||||
<version>1.1.0</version>
|
||||
<basedir>${project.basedir}/../api/maven-api-toolchain</basedir>
|
||||
<velocityBasedir>${project.basedir}/../src/mdo</velocityBasedir>
|
||||
<models>
|
||||
<model>target/mdo/toolchains.mdo</model>
|
||||
<model>src/main/mdo/toolchains.mdo</model>
|
||||
</models>
|
||||
</configuration>
|
||||
<executions>
|
||||
|
@ -92,10 +69,10 @@ under the License.
|
|||
<phase>generate-sources</phase>
|
||||
<configuration>
|
||||
<templates>
|
||||
<template>src/main/mdo/model-v3.vm</template>
|
||||
<template>src/main/mdo/merger.vm</template>
|
||||
<template>src/main/mdo/reader.vm</template>
|
||||
<template>src/main/mdo/writer.vm</template>
|
||||
<template>model-v3.vm</template>
|
||||
<template>merger.vm</template>
|
||||
<template>reader.vm</template>
|
||||
<template>writer.vm</template>
|
||||
</templates>
|
||||
<params>
|
||||
<param>packageModelV3=org.apache.maven.toolchain.model</param>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
##
|
||||
## Nothing special to do here
|
||||
##
|
|
@ -1,379 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Merger" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.ObjectStreamException;
|
||||
import java.util.AbstractList;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.function.BinaryOperator;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.api.xml.XmlNode;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.Name};
|
||||
#end
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
|
||||
/**
|
||||
* Merges the specified source object into the given target object.
|
||||
*
|
||||
* @param target The target object whose existing contents should be merged with the source, must not be
|
||||
* <code>null</code>.
|
||||
* @param source The (read-only) source object that should be merged into the target object, may be
|
||||
* <code>null</code>.
|
||||
* @param sourceDominant A flag indicating whether either the target object or the source object provides the
|
||||
* dominant data.
|
||||
* @param hints A set of key-value pairs that customized merger implementations can use to carry domain-specific
|
||||
* information along, may be <code>null</code>.
|
||||
*/
|
||||
public ${root.name} merge( ${root.name} target, ${root.name} source, boolean sourceDominant, Map<?, ?> hints )
|
||||
{
|
||||
Objects.requireNonNull( target, "target cannot be null" );
|
||||
if ( source == null )
|
||||
{
|
||||
return target;
|
||||
}
|
||||
Map<Object, Object> context = new HashMap<>();
|
||||
if ( hints != null )
|
||||
{
|
||||
context.putAll( hints );
|
||||
}
|
||||
return merge${root.name}( target, source, sourceDominant, context );
|
||||
}
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
protected ${class.name} merge${class.name}( ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
${class.name}.Builder builder = ${class.name}.newBuilder( target );
|
||||
merge${class.name}( builder, target, source, sourceDominant, context );
|
||||
return builder.build();
|
||||
}
|
||||
|
||||
protected void merge${class.name}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
merge${class.superClass}( builder, target ,source, sourceDominant, context );
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
merge${field.modelClass.name}_${Helper.capitalise($field.name)}( builder, target, source, sourceDominant, context );
|
||||
#end
|
||||
}
|
||||
|
||||
#foreach ( $field in $allFields )
|
||||
#set ( $capField = ${Helper.capitalise($field.name)} )
|
||||
protected void merge${class.name}_${capField}( ${class.name}.Builder builder, ${class.name} target, ${class.name} source, boolean sourceDominant, Map<Object, Object> context )
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
String src = source.get${capField}();
|
||||
String tgt = target.get${capField}();
|
||||
if ( src != null && ( sourceDominant || tgt == null ) )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, e -> e ) );
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
Map<String, String> src = source.get${capField}();
|
||||
if ( !src.isEmpty() )
|
||||
{
|
||||
Map<String, String> tgt = target.get${capField}();
|
||||
if ( tgt.isEmpty() )
|
||||
{
|
||||
builder.${field.name}( src );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else
|
||||
{
|
||||
Map<String, String> merged = new HashMap<>();
|
||||
merged.putAll( sourceDominant ? target.get${capField}() : source.get${capField}() );
|
||||
merged.putAll( sourceDominant ? source.get${capField}() : target.get${capField}() );
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
${field.to} src = source.get${capField}();
|
||||
if ( src != null )
|
||||
{
|
||||
${field.to} tgt = target.get${capField}();
|
||||
if ( tgt == null )
|
||||
{
|
||||
tgt = ${field.to}.newInstance( false );
|
||||
}
|
||||
${field.to} merged = merge${field.to}( tgt, src, sourceDominant, context );
|
||||
if ( merged == src )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", source.getLocation( "${field.name}" ) );
|
||||
#end
|
||||
}
|
||||
else if ( merged != tgt )
|
||||
{
|
||||
builder.${field.name}( merged );
|
||||
#if ( $locationTracking )
|
||||
builder.location( "${field.name}", InputLocation.merge( target.getLocation( "${field.name}" ), source.getLocation( "${field.name}" ), sourceDominant ) );
|
||||
#end
|
||||
}
|
||||
}
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
builder.${field.name}( merge( target.get${capField}(), source.get${capField}(), sourceDominant, get${field.to}Key() ) );
|
||||
#elseif ( $field.type == "DOM" )
|
||||
XmlNode src = source.getConfiguration();
|
||||
if ( src != null )
|
||||
{
|
||||
XmlNode tgt = target.getConfiguration();
|
||||
if ( tgt == null )
|
||||
{
|
||||
builder.configuration( src );
|
||||
}
|
||||
else if ( sourceDominant )
|
||||
{
|
||||
builder.configuration( src.merge( tgt ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
builder.configuration( tgt.merge( src ) );
|
||||
}
|
||||
}
|
||||
#elseif ( $field.type == "boolean" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.is${capField}() );
|
||||
}
|
||||
#elseif ( $field.type == "int" || $field.type == "java.nio.file.Path" )
|
||||
if ( sourceDominant )
|
||||
{
|
||||
builder.${field.name}( source.get${capField}() );
|
||||
}
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
}
|
||||
#end
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
protected KeyComputer<${class.name}> get${class.name}Key()
|
||||
{
|
||||
return v -> v;
|
||||
}
|
||||
#end
|
||||
#end
|
||||
|
||||
/**
|
||||
* Use to compute keys for data structures
|
||||
* @param <T> the data structure type
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface KeyComputer<T> extends Function<T, Object>
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge two lists
|
||||
*/
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, boolean sourceDominant, KeyComputer<T> computer )
|
||||
{
|
||||
return merge( tgt, src, computer, ( t, s ) -> sourceDominant ? s : t );
|
||||
}
|
||||
|
||||
public static <T> List<T> merge( List<T> tgt, List<T> src, KeyComputer<T> computer, BinaryOperator<T> remapping )
|
||||
{
|
||||
if ( src.isEmpty() )
|
||||
{
|
||||
return tgt;
|
||||
}
|
||||
|
||||
MergingList<T> list;
|
||||
if ( tgt instanceof MergingList )
|
||||
{
|
||||
list = (MergingList<T>) tgt;
|
||||
}
|
||||
else
|
||||
{
|
||||
list = new MergingList<>( computer, src.size() + tgt.size() );
|
||||
list.mergeAll( tgt, ( t, s ) -> s );
|
||||
}
|
||||
|
||||
list.mergeAll( src, remapping );
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merging list
|
||||
* @param <V>
|
||||
*/
|
||||
private static class MergingList<V> extends AbstractList<V> implements java.io.Serializable
|
||||
{
|
||||
|
||||
private final KeyComputer<V> keyComputer;
|
||||
private Map<Object, V> map;
|
||||
private List<V> list;
|
||||
|
||||
MergingList( KeyComputer<V> keyComputer, int initialCapacity )
|
||||
{
|
||||
this.map = new LinkedHashMap<>( initialCapacity );
|
||||
this.keyComputer = keyComputer;
|
||||
}
|
||||
|
||||
Object writeReplace() throws ObjectStreamException
|
||||
{
|
||||
return new ArrayList<>( this );
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<V> iterator()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.values().iterator();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.iterator();
|
||||
}
|
||||
}
|
||||
|
||||
void mergeAll( Collection<V> vs, BinaryOperator<V> remapping )
|
||||
{
|
||||
if ( map == null )
|
||||
{
|
||||
map = list.stream().collect( Collectors.toMap( keyComputer,
|
||||
Function.identity(),
|
||||
null,
|
||||
LinkedHashMap::new ) );
|
||||
|
||||
list = null;
|
||||
}
|
||||
|
||||
if ( vs instanceof MergingList && ( (MergingList<V>) vs ).map != null )
|
||||
{
|
||||
for ( Map.Entry<Object, V> e : ( (MergingList<V>) vs ).map.entrySet() )
|
||||
{
|
||||
Object key = e.getKey();
|
||||
V v = e.getValue();
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for ( V v : vs )
|
||||
{
|
||||
Object key = keyComputer.apply( v );
|
||||
|
||||
map.merge( key, v, remapping );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean contains( Object o )
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.containsValue( o );
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.contains( o );
|
||||
}
|
||||
}
|
||||
|
||||
private List<V> asList()
|
||||
{
|
||||
if ( list == null )
|
||||
{
|
||||
list = new ArrayList<>( map.values() );
|
||||
map = null;
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add( int index, V element )
|
||||
{
|
||||
asList().add( index, element );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V remove( int index )
|
||||
{
|
||||
return asList().remove( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public V get( int index )
|
||||
{
|
||||
return asList().get( index );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size()
|
||||
{
|
||||
if ( map != null )
|
||||
{
|
||||
return map.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
return list.size();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,255 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV3}" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#set ( $inheritedFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#if ( $cl != $class )
|
||||
#set ( $dummy = $inheritedFields.addAll( $cl.allFields ) )
|
||||
#end
|
||||
#set ( $dummy = $allFields.addAll( $cl.allFields ) )
|
||||
#end
|
||||
#set ( $className = "${class.name}" )
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
#if ( $class.name != "InputLocation" && $class.name != "InputSource" )
|
||||
#set ( $types = { } )
|
||||
#set ( $imports = $class.getClass().forName("java.util.TreeSet").newInstance() )
|
||||
#set ( $dummy = $imports.add( "java.io.Serializable" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.AbstractList" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Collections" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.HashMap" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.List" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.Map" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.stream.Collectors" ) )
|
||||
#set ( $dummy = $imports.add( "java.util.stream.Stream" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Generated" ) )
|
||||
#set ( $dummy = $imports.add( "org.apache.maven.api.annotations.Nonnull" ) )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.type == "java.util.List" )
|
||||
#set ( $dummy = $imports.add( "java.util.ArrayList" ) )
|
||||
#set ( $dummy = $types.put( $field, "List<" + $field.to + ">" ) )
|
||||
#elseif ( $field.type == "DOM" )
|
||||
#set ( $dummy = $imports.add( "org.codehaus.plexus.util.xml.Xpp3Dom" ) )
|
||||
#set ( $dummy = $types.put( $field, "Object" ) )
|
||||
#else
|
||||
#set ( $fieldType = ${types.getOrDefault($field.type,$field.type)} )
|
||||
#set ( $idx = $fieldType.lastIndexOf('.') )
|
||||
#if ( $idx > 0 )
|
||||
#set ( $dummy = $imports.add( $fieldType ) )
|
||||
#set ( $dummy = $types.put( $fieldType, $fieldType.substring( $idx + 1 ) ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#set ( $eq = "" )
|
||||
#set ( $hc = "" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $field.identifier )
|
||||
#set ( $dummy = $imports.add( "java.util.Objects" ) )
|
||||
#set ( $dummy = $identifiers.add( $field ) )
|
||||
#if ( $eq == "" )
|
||||
#set ( $eq = "Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#else
|
||||
#set ( $eq = "$eq && Objects.equals( this.${field.name}, that.${field.name} )" )
|
||||
#end
|
||||
#if ( $hc == "" )
|
||||
#set ( $hc = "${field.name}" )
|
||||
#else
|
||||
#set ( $hc = "$hc, this.${field.name}" )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
#foreach ( $imp in $imports )
|
||||
import $imp;
|
||||
#end
|
||||
|
||||
@Generated
|
||||
public class ${class.name}
|
||||
#if ( $class.superClass )
|
||||
extends ${class.superClass}
|
||||
#end
|
||||
implements Serializable, Cloneable
|
||||
{
|
||||
|
||||
#if ( ! $class.superClass )
|
||||
${packageModelV4}.${class.name} delegate;
|
||||
#end
|
||||
|
||||
public ${class.name}()
|
||||
{
|
||||
this( ${packageModelV4}.${class.name}.newInstance() );
|
||||
}
|
||||
|
||||
public ${class.name}( ${packageModelV4}.${class.name} delegate )
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
super( delegate );
|
||||
#else
|
||||
this.delegate = delegate;
|
||||
#end
|
||||
}
|
||||
|
||||
public ${class.name} clone()
|
||||
{
|
||||
return new ${class.name}( getDelegate() );
|
||||
}
|
||||
|
||||
#if ( $class.superClass )
|
||||
@Override
|
||||
#end
|
||||
public ${packageModelV4}.${class.name} getDelegate()
|
||||
{
|
||||
#if ( $class.superClass )
|
||||
return ( ${packageModelV4}.${class.name} ) delegate;
|
||||
#else
|
||||
return delegate;
|
||||
#end
|
||||
}
|
||||
|
||||
#if ( ! $eq.empty )
|
||||
@Override
|
||||
public boolean equals( Object o )
|
||||
{
|
||||
if ( this == o )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if ( o == null || !( o instanceof ${class.name} ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
${class.name} that = ( ${class.name} ) o;
|
||||
return Objects.equals( this.delegate, that.delegate );
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode()
|
||||
{
|
||||
return getDelegate().hashCode();
|
||||
}
|
||||
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
public String getModelEncoding()
|
||||
{
|
||||
return getDelegate().getModelEncoding();
|
||||
}
|
||||
|
||||
#end
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $cap = $Helper.capitalise( $field.name ) )
|
||||
#set ( $type = ${types.getOrDefault($field,${types.getOrDefault($field.type,$field.type)})} )
|
||||
#if ( $type == "boolean" || $type == "Boolean" )
|
||||
#set ( $pfx = "is" )
|
||||
#else
|
||||
#set ( $pfx = "get" )
|
||||
#end
|
||||
#if ( $field.type == "java.util.List" || $field.type == "java.util.Properties" )
|
||||
@Nonnull
|
||||
#end
|
||||
public ${type} ${pfx}${cap}()
|
||||
{
|
||||
#if ( $field.to != "String" && $field.type == "java.util.List" && $field.multiplicity == "*" )
|
||||
return new WrapperList<${field.to}, ${packageModelV4}.${field.to}>(
|
||||
getDelegate()::get${cap}, l -> delegate = getDelegate().with${cap}( l ),
|
||||
${field.to}::new, ${field.to}::getDelegate );
|
||||
#elseif ( $field.to == "String" && $field.type == "java.util.Properties" && $field.multiplicity == "*" )
|
||||
return new WrapperProperties( getDelegate()::get${cap}, this::set${cap} );
|
||||
#elseif ( $field.to == "String" && $field.type == "java.util.List" && $field.multiplicity == "*" )
|
||||
return new WrapperList<String, ${field.to}>( getDelegate()::get${cap}, this::set${cap}, s -> s, s -> s );
|
||||
#elseif ( $field.to )
|
||||
return getDelegate().${pfx}${cap}() != null ? new ${field.to}( getDelegate().${pfx}${cap}() ) : null;
|
||||
#elseif ( $field.type == "DOM" )
|
||||
return getDelegate().${pfx}${cap}() != null ? new Xpp3Dom( getDelegate().${pfx}${cap}() ) : null;
|
||||
#else
|
||||
return getDelegate().${pfx}${cap}();
|
||||
#end
|
||||
}
|
||||
|
||||
public void set${cap}( ${type} ${field.name} )
|
||||
{
|
||||
#if ( $field.type == "DOM" )
|
||||
delegate = getDelegate().with${cap}( ( ( Xpp3Dom ) ${field.name} ).getDom() );
|
||||
#elseif( $field.type == "java.util.Properties" )
|
||||
Map<String, String> map = ${field.name}.entrySet().stream()
|
||||
.collect( Collectors.toMap( e -> e.getKey().toString(), e -> e.getValue().toString() ) );
|
||||
delegate = getDelegate().with${cap}( map );
|
||||
#elseif ( $field.to != "String" && $field.type == "java.util.List" && $field.multiplicity == "*" )
|
||||
delegate = getDelegate().with${cap}(
|
||||
${field.name}.stream().map( c -> c.getDelegate() ).collect( Collectors.toList() ) );
|
||||
#elseif ( $field.to && $field.to != "String" )
|
||||
delegate = getDelegate().with${cap}( ${field.name}.getDelegate() );
|
||||
#else
|
||||
delegate = getDelegate().with${cap}( ${field.name} );
|
||||
#end
|
||||
}
|
||||
|
||||
#if ( $field.type == "java.util.List" && $field.multiplicity == "*" )
|
||||
#set ( $v = $Helper.singular( ${field.name} ) )
|
||||
#set ( $scap = $Helper.capitalise( $v ) )
|
||||
public void add${scap}( ${field.to} ${v} )
|
||||
{
|
||||
#if ( $field.to == "String" )
|
||||
delegate = getDelegate().with${cap}(
|
||||
Stream.concat( getDelegate().get${cap}().stream(), Stream.of( ${v} ) )
|
||||
.collect( Collectors.toList() ) );
|
||||
#else
|
||||
delegate = getDelegate().with${cap}(
|
||||
Stream.concat( getDelegate().get${cap}().stream(), Stream.of( ${v}.getDelegate() ) )
|
||||
.collect( Collectors.toList() ) );
|
||||
#end
|
||||
}
|
||||
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.multiplicity == "*" )
|
||||
#set ( $v = $Helper.singular( ${field.name} ) )
|
||||
#set ( $scap = $Helper.capitalise( $v ) )
|
||||
public void add${scap}( String key, String value )
|
||||
{
|
||||
get${cap}().put( key, value );
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
public static List<${packageModelV4}.${class.name}> ${Helper.uncapitalise(${class.name})}ToApiV4( List<${class.name}> list )
|
||||
{
|
||||
return list != null ? new WrapperList<>( list, ${class.name}::getDelegate, ${class.name}::new ) : null;
|
||||
}
|
||||
|
||||
public static List<${class.name}> ${Helper.uncapitalise(${class.name})}ToApiV3( List<${packageModelV4}.${class.name}> list )
|
||||
{
|
||||
return list != null ? new WrapperList<>( list, ${class.name}::new, ${class.name}::getDelegate ) : null;
|
||||
}
|
||||
|
||||
#foreach ( $cs in $class.getCodeSegments($version) )
|
||||
$cs.code
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
|
@ -1,902 +0,0 @@
|
|||
#*
|
||||
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.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Reader" )
|
||||
#
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
#set ( $rootXml = $Helper.xmlClassMetadata( $root ) )
|
||||
#set ( $rootTag = $rootXml.tagName )
|
||||
#set ( $rootUcapName = $Helper.capitalise( $root.name ) )
|
||||
#set ( $rootLcapName = $Helper.uncapitalise( $root.name ) )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.Reader;
|
||||
import java.text.DateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import org.apache.maven.api.annotations.Generated;
|
||||
import org.apache.maven.internal.xml.XmlNodeBuilder;
|
||||
#foreach ( $class in $model.allClasses )
|
||||
import ${packageModelV4}.${class.name};
|
||||
#end
|
||||
import org.codehaus.plexus.util.ReaderFactory;
|
||||
import org.codehaus.plexus.util.xml.pull.EntityReplacementMap;
|
||||
import org.codehaus.plexus.util.xml.pull.MXParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParser;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
|
||||
@Generated
|
||||
public class ${className}
|
||||
{
|
||||
private boolean addDefaultEntities = true;
|
||||
|
||||
private final ContentTransformer contentTransformer;
|
||||
|
||||
public ${className}()
|
||||
{
|
||||
this( ( s, f ) -> s );
|
||||
}
|
||||
|
||||
public ${className}( ContentTransformer contentTransformer )
|
||||
{
|
||||
this.contentTransformer = contentTransformer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method checkFieldWithDuplicate.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param parsed a parsed object.
|
||||
* @param alias a alias object.
|
||||
* @param tagName a tagName object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean checkFieldWithDuplicate( XmlPullParser parser, String tagName, String alias, Set<String> parsed )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( !( parser.getName().equals( tagName ) || parser.getName().equals( alias ) ) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if ( !parsed.add( tagName ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
|
||||
}
|
||||
return true;
|
||||
} //-- boolean checkFieldWithDuplicate( XmlPullParser, String, String, Set<String> )
|
||||
|
||||
/**
|
||||
* Method checkUnknownAttribute.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @param tagName a tagName object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @throws IOException IOException if any.
|
||||
*/
|
||||
private void checkUnknownAttribute( XmlPullParser parser, String attribute, String tagName, boolean strict )
|
||||
throws XmlPullParserException, IOException
|
||||
{
|
||||
// strictXmlAttributes = true for model: if strict == true, not only elements are checked but attributes too
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unknown attribute '" + attribute + "' for tag '" + tagName + "'", parser, null );
|
||||
}
|
||||
} //-- void checkUnknownAttribute( XmlPullParser, String, String, boolean )
|
||||
|
||||
/**
|
||||
* Method checkUnknownElement.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @throws IOException IOException if any.
|
||||
*/
|
||||
private void checkUnknownElement( XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException, IOException
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unrecognised tag: '" + parser.getName() + "'", parser, null );
|
||||
}
|
||||
|
||||
for ( int unrecognizedTagCount = 1; unrecognizedTagCount > 0; )
|
||||
{
|
||||
int eventType = parser.next();
|
||||
if ( eventType == XmlPullParser.START_TAG )
|
||||
{
|
||||
unrecognizedTagCount++;
|
||||
}
|
||||
else if ( eventType == XmlPullParser.END_TAG )
|
||||
{
|
||||
unrecognizedTagCount--;
|
||||
}
|
||||
}
|
||||
} //-- void checkUnknownElement( XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Returns the state of the "add default entities" flag.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public boolean getAddDefaultEntities()
|
||||
{
|
||||
return addDefaultEntities;
|
||||
} //-- boolean getAddDefaultEntities()
|
||||
|
||||
/**
|
||||
* Method getBooleanValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean getBooleanValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getBooleanValue( s, attribute, parser, null );
|
||||
} //-- boolean getBooleanValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getBooleanValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param defaultValue a defaultValue object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return boolean
|
||||
*/
|
||||
private boolean getBooleanValue( String s, String attribute, XmlPullParser parser, String defaultValue )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null && s.length() != 0 )
|
||||
{
|
||||
return Boolean.valueOf( s ).booleanValue();
|
||||
}
|
||||
if ( defaultValue != null )
|
||||
{
|
||||
return Boolean.valueOf( defaultValue ).booleanValue();
|
||||
}
|
||||
return false;
|
||||
} //-- boolean getBooleanValue( String, String, XmlPullParser, String )
|
||||
|
||||
/**
|
||||
* Method getByteValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return byte
|
||||
*/
|
||||
private byte getByteValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Byte.valueOf( s ).byteValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a byte", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- byte getByteValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getCharacterValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return char
|
||||
*/
|
||||
private char getCharacterValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
return s.charAt( 0 );
|
||||
}
|
||||
return 0;
|
||||
} //-- char getCharacterValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDateValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return Date
|
||||
*/
|
||||
private Date getDateValue( String s, String attribute, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getDateValue( s, attribute, null, parser );
|
||||
} //-- Date getDateValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDateValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param dateFormat a dateFormat object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return Date
|
||||
*/
|
||||
private Date getDateValue( String s, String attribute, String dateFormat, XmlPullParser parser )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
String effectiveDateFormat = dateFormat;
|
||||
if ( dateFormat == null )
|
||||
{
|
||||
effectiveDateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
|
||||
}
|
||||
if ( "long".equals( effectiveDateFormat ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new java.util.Date( Long.parseLong( s ) );
|
||||
}
|
||||
catch ( NumberFormatException e )
|
||||
{
|
||||
throw new XmlPullParserException( e.getMessage(), parser, e );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
DateFormat dateParser = new java.text.SimpleDateFormat( effectiveDateFormat, java.util.Locale.US );
|
||||
return dateParser.parse( s );
|
||||
}
|
||||
catch ( java.text.ParseException e )
|
||||
{
|
||||
throw new XmlPullParserException( e.getMessage(), parser, e );
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
} //-- Date getDateValue( String, String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getDoubleValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return double
|
||||
*/
|
||||
private double getDoubleValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Double.valueOf( s ).doubleValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- double getDoubleValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getFloatValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return float
|
||||
*/
|
||||
private float getFloatValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Float.valueOf( s ).floatValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a floating point number", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- float getFloatValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getIntegerValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
return getIntegerValue( s, attribute, parser, strict, 0 );
|
||||
} //-- int getBooleanValue( String, String, XmlPullParser )
|
||||
|
||||
/**
|
||||
* Method getIntegerValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int getIntegerValue( String s, String attribute, XmlPullParser parser, boolean strict, int defaultValue )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Integer.valueOf( s ).intValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be an integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return defaultValue;
|
||||
} //-- int getIntegerValue( String, String, XmlPullParser, boolean, int )
|
||||
|
||||
/**
|
||||
* Method getLongValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return long
|
||||
*/
|
||||
private long getLongValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Long.valueOf( s ).longValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a long integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- long getLongValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getRequiredAttributeValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return String
|
||||
*/
|
||||
private String getRequiredAttributeValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s == null )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Missing required value for attribute '" + attribute + "'", parser, null );
|
||||
}
|
||||
}
|
||||
return s;
|
||||
} //-- String getRequiredAttributeValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getShortValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @param strict a strict object.
|
||||
* @param parser a parser object.
|
||||
* @param attribute a attribute object.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return short
|
||||
*/
|
||||
private short getShortValue( String s, String attribute, XmlPullParser parser, boolean strict )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
try
|
||||
{
|
||||
return Short.valueOf( s ).shortValue();
|
||||
}
|
||||
catch ( NumberFormatException nfe )
|
||||
{
|
||||
if ( strict )
|
||||
{
|
||||
throw new XmlPullParserException( "Unable to parse element '" + attribute + "', must be a short integer", parser, nfe );
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
} //-- short getShortValue( String, String, XmlPullParser, boolean )
|
||||
|
||||
/**
|
||||
* Method getTrimmedValue.
|
||||
*
|
||||
* @param s a s object.
|
||||
* @return String
|
||||
*/
|
||||
private String getTrimmedValue( String s )
|
||||
{
|
||||
if ( s != null )
|
||||
{
|
||||
s = s.trim();
|
||||
}
|
||||
return s;
|
||||
} //-- String getTrimmedValue( String )
|
||||
|
||||
/**
|
||||
* Method interpolatedTrimmed.
|
||||
*
|
||||
* @param value a value object.
|
||||
* @param context a context object.
|
||||
* @return String
|
||||
*/
|
||||
private String interpolatedTrimmed( String value, String context )
|
||||
{
|
||||
return getTrimmedValue( contentTransformer.transform( value, context ) );
|
||||
} //-- String interpolatedTrimmed( String, String )
|
||||
|
||||
/**
|
||||
* Method nextTag.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return int
|
||||
*/
|
||||
private int nextTag( XmlPullParser parser )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
int eventType = parser.next();
|
||||
if ( eventType == XmlPullParser.TEXT )
|
||||
{
|
||||
eventType = parser.next();
|
||||
}
|
||||
if ( eventType != XmlPullParser.START_TAG && eventType != XmlPullParser.END_TAG )
|
||||
{
|
||||
throw new XmlPullParserException( "expected START_TAG or END_TAG not " + XmlPullParser.TYPES[eventType], parser, null );
|
||||
}
|
||||
return eventType;
|
||||
} //-- int nextTag( XmlPullParser )
|
||||
|
||||
/**
|
||||
* @see ReaderFactory#newXmlReader
|
||||
*
|
||||
* @param reader a reader object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( Reader reader, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
XmlPullParser parser = addDefaultEntities ? new MXParser(EntityReplacementMap.defaultEntityReplacementMap) : new MXParser( );
|
||||
|
||||
parser.setInput( reader );
|
||||
|
||||
|
||||
return read( parser, strict );
|
||||
} //-- ${root.name} read( Reader, boolean )
|
||||
|
||||
/**
|
||||
* @see ReaderFactory#newXmlReader
|
||||
*
|
||||
* @param reader a reader object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( Reader reader )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( reader, true );
|
||||
} //-- ${root.name} read( Reader )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param in a in object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( InputStream in, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( ReaderFactory.newXmlReader( in ), strict );
|
||||
} //-- ${root.name} read( InputStream, boolean )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param in a in object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( InputStream in )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
return read( ReaderFactory.newXmlReader( in ) );
|
||||
} //-- ${root.name} read( InputStream )
|
||||
|
||||
/**
|
||||
* Method read.
|
||||
*
|
||||
* @param parser a parser object.
|
||||
* @param strict a strict object.
|
||||
* @throws IOException IOException if any.
|
||||
* @throws XmlPullParserException XmlPullParserException if
|
||||
* any.
|
||||
* @return ${root.name}
|
||||
*/
|
||||
public ${root.name} read( XmlPullParser parser, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
$rootUcapName $rootLcapName = null;
|
||||
int eventType = parser.getEventType();
|
||||
boolean parsed = false;
|
||||
while ( eventType != XmlPullParser.END_DOCUMENT )
|
||||
{
|
||||
if ( eventType == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( strict && ! "${rootTag}".equals( parser.getName() ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Expected root element '${rootTag}' but found '" + parser.getName() + "'", parser, null );
|
||||
}
|
||||
else if ( parsed )
|
||||
{
|
||||
// fallback, already expected a XmlPullParserException due to invalid XML
|
||||
throw new XmlPullParserException( "Duplicated tag: '${rootTag}'", parser, null );
|
||||
}
|
||||
$rootLcapName = parse${rootUcapName}( parser, strict );
|
||||
parsed = true;
|
||||
}
|
||||
eventType = parser.next();
|
||||
}
|
||||
if ( parsed )
|
||||
{
|
||||
return $rootLcapName;
|
||||
}
|
||||
throw new XmlPullParserException( "Expected root element '${rootTag}' but found no element at all: invalid XML document", parser, null );
|
||||
} //-- ${root.name} read( XmlPullParser, boolean )
|
||||
|
||||
#foreach ( $class in $model.allClasses )
|
||||
#if ( $class.name != "InputSource" && $class.name != "InputLocation" )
|
||||
#set ( $classUcapName = $Helper.capitalise( $class.name ) )
|
||||
#set ( $classLcapName = $Helper.uncapitalise( $class.name ) )
|
||||
#set ( $ancestors = $Helper.ancestors( $class ) )
|
||||
#set ( $allFields = [] )
|
||||
#foreach ( $cl in $ancestors )
|
||||
#set ( $dummy = $allFields.addAll( $cl.getFields($version) ) )
|
||||
#end
|
||||
private ${classUcapName} parse${classUcapName}( XmlPullParser parser, boolean strict )
|
||||
throws IOException, XmlPullParserException
|
||||
{
|
||||
String tagName = parser.getName();
|
||||
${classUcapName}.Builder ${classLcapName} = ${classUcapName}.newBuilder( true );
|
||||
for ( int i = parser.getAttributeCount() - 1; i >= 0; i-- )
|
||||
{
|
||||
String name = parser.getAttributeName( i );
|
||||
String value = parser.getAttributeValue( i );
|
||||
if ( name.indexOf( ':' ) >= 0 )
|
||||
{
|
||||
// just ignore attributes with non-default namespace (for example: xmlns:xsi)
|
||||
}
|
||||
#if ( $class == $root )
|
||||
else if ( "xmlns".equals( name ) )
|
||||
{
|
||||
// ignore xmlns attribute in root class, which is a reserved attribute name
|
||||
}
|
||||
#end
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.xmlFieldMetadata( $field ).attribute )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
else if ( "$fieldTagName".equals( name ) )
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
${classLcapName}.${field.name}( interpolatedTrimmed( value, "$fieldTagName" ) );
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
${classLcapName}.${field.name}( getBooleanValue( interpolatedTrimmed( value, "$fieldTagName" ), "$fieldTagName", parser, "${field.defaultValue}" ) );
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#end
|
||||
else
|
||||
{
|
||||
checkUnknownAttribute( parser, name, tagName, strict );
|
||||
}
|
||||
}
|
||||
Set<String> parsed = new HashSet<>();
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
List<$field.to> ${field.name} = new ArrayList<>();
|
||||
#end
|
||||
#end
|
||||
while ( ( strict ? parser.nextTag() : nextTag( parser ) ) == XmlPullParser.START_TAG )
|
||||
{
|
||||
String childName = checkDuplicate( parser.getName(), parser, parsed );
|
||||
switch ( childName )
|
||||
{
|
||||
#set( $ift = "if" )
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( ! $Helper.xmlFieldMetadata( $field ).attribute && ! $Helper.xmlFieldMetadata( $field ).transient )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
#set ( $fieldTagName = $Helper.singular( $fieldTagName ) )
|
||||
#end
|
||||
#set ( $fieldCapName = $Helper.capitalise( $field.name ) )
|
||||
case "${fieldTagName}":
|
||||
{
|
||||
#if ( $field.type == "String" )
|
||||
${classLcapName}.${field.name}( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ) );
|
||||
break;
|
||||
#elseif ( $field.type == "boolean" || $field.type == "Boolean" )
|
||||
${classLcapName}.${field.name}( getBooleanValue( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ), "${fieldTagName}", parser, "${field.defaultValue}" ) );
|
||||
break;
|
||||
#elseif ( $field.type == "int" )
|
||||
${classLcapName}.${field.name}( getIntegerValue( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ), "${fieldTagName}", parser, strict, ${field.defaultValue} ) );
|
||||
break;
|
||||
#elseif ( $field.type == "DOM" )
|
||||
${classLcapName}.${field.name}( XmlNodeBuilder.build( parser, true ) );
|
||||
break;
|
||||
#elseif ( $field.type == "java.util.List" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
List<String> ${field.name} = new ArrayList<>();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( "${Helper.singular($fieldTagName)}".equals( parser.getName() ) )
|
||||
{
|
||||
${field.name}.add( interpolatedTrimmed( parser.nextText(), "${fieldTagName}" ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
}
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#elseif ( $field.type == "java.util.Properties" && $field.to == "String" && $field.multiplicity == "*" )
|
||||
Map<String, String> ${field.name} = new LinkedHashMap<>();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
String key = parser.getName();
|
||||
String value = parser.nextText().trim();
|
||||
${field.name}.put( key, value );
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "1" )
|
||||
${classLcapName}.${field.name}( parse${field.toClass.name}( parser, strict ) );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "*" && $Helper.isFlatItems( $field ) )
|
||||
${field.name}.add( parse${field.toClass.name}( parser, strict ) );
|
||||
break;
|
||||
#elseif ( $field.to && $field.multiplicity == "*" )
|
||||
List<$field.to> ${field.name} = new ArrayList<>();
|
||||
while ( parser.nextTag() == XmlPullParser.START_TAG )
|
||||
{
|
||||
if ( "${Helper.singular($fieldTagName)}".equals( parser.getName() ) )
|
||||
{
|
||||
${field.name}.add( parse${field.toClass.name}( parser, strict ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
}
|
||||
}
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
break;
|
||||
#else
|
||||
// TODO: type=${field.type} to=${field.to} multiplicity=${field.multiplicity}
|
||||
break;
|
||||
#end
|
||||
}
|
||||
#set( $ift = "else if" )
|
||||
#end
|
||||
#end
|
||||
default:
|
||||
{
|
||||
checkUnknownElement( parser, strict );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#foreach ( $field in $allFields )
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
${classLcapName}.${field.name}( ${field.name} );
|
||||
#end
|
||||
#end
|
||||
#if ( $class == $root )
|
||||
${classLcapName}.modelEncoding( parser.getInputEncoding() );
|
||||
#end
|
||||
return ${classLcapName}.build();
|
||||
}
|
||||
|
||||
#end
|
||||
#end
|
||||
|
||||
private String checkDuplicate( String tagName, XmlPullParser parser, Set<String> parsed )
|
||||
throws XmlPullParserException
|
||||
{
|
||||
#set( $aliases = { } )
|
||||
#set( $flats = { } )
|
||||
#foreach( $class in $model.allClasses )
|
||||
#foreach ( $field in $class.getFields($version) )
|
||||
#set ( $fieldTagName = $Helper.xmlFieldMetadata( $field ).tagName )
|
||||
#if ( ! $fieldTagName )
|
||||
#set ( $fieldTagName = $field.name )
|
||||
#end
|
||||
#if ( $field.alias )
|
||||
#set ( $dummy = $aliases.put( $field.alias, $fieldTagName ) )
|
||||
#end
|
||||
#if ( $Helper.isFlatItems( $field ) )
|
||||
#set ( $fieldTagName = $Helper.singular($fieldTagName) )
|
||||
#set ( $dummy = $flats.put( $fieldTagName, "" ) )
|
||||
#end
|
||||
#end
|
||||
#end
|
||||
#if ( ! ${aliases.isEmpty()} )
|
||||
switch ( tagName )
|
||||
{
|
||||
#foreach( $entry in $aliases.entrySet() )
|
||||
case "${entry.key}":
|
||||
tagName = "${entry.value}";
|
||||
#end
|
||||
}
|
||||
#end
|
||||
#if ( ! ${flats.isEmpty()} )
|
||||
switch ( tagName )
|
||||
{
|
||||
#foreach( $entry in $flats.entrySet() )
|
||||
case "${entry.key}":
|
||||
#end
|
||||
break;
|
||||
default:
|
||||
if ( !parsed.add( tagName ) )
|
||||
{
|
||||
throw new XmlPullParserException( "Duplicated tag: '" + tagName + "'", parser, null );
|
||||
}
|
||||
}
|
||||
#end
|
||||
return tagName;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the state of the "add default entities" flag.
|
||||
*
|
||||
* @param addDefaultEntities a addDefaultEntities object.
|
||||
*/
|
||||
public void setAddDefaultEntities( boolean addDefaultEntities )
|
||||
{
|
||||
this.addDefaultEntities = addDefaultEntities;
|
||||
} //-- void setAddDefaultEntities( boolean )
|
||||
|
||||
public static interface ContentTransformer
|
||||
{
|
||||
/**
|
||||
* Interpolate the value read from the xpp3 document
|
||||
* @param source The source value
|
||||
* @param fieldName A description of the field being interpolated. The implementation may use this to
|
||||
* log stuff.
|
||||
* @return The interpolated value.
|
||||
*/
|
||||
String transform( String source, String fieldName );
|
||||
}
|
||||
|
||||
}
|
2
pom.xml
2
pom.xml
|
@ -525,7 +525,7 @@ under the License.
|
|||
<plugin>
|
||||
<groupId>org.codehaus.modello</groupId>
|
||||
<artifactId>modello-maven-plugin</artifactId>
|
||||
<version>2.1.0</version>
|
||||
<version>2.1.1</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>modello-site-docs</id>
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
under the License.
|
||||
*#
|
||||
#
|
||||
#if ( "${isMavenModel}" == "true" )
|
||||
##
|
||||
## The following loop code is required in order to change the type of the
|
||||
## pomFile attribute to a java.nio.file.Path. Modello does not support this
|
||||
|
@ -28,4 +29,5 @@
|
|||
#end
|
||||
#end
|
||||
#set ( $locationTracking = true )
|
||||
#end
|
||||
#
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Merger" )
|
||||
|
@ -25,7 +25,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV3}" )
|
||||
#
|
||||
|
@ -83,7 +83,7 @@
|
|||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV3}" )
|
||||
#
|
||||
|
@ -82,7 +82,7 @@
|
|||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageModelV4}" )
|
||||
#set ( $root = $model.getClass( $model.getRoot($version), $version ) )
|
||||
|
@ -85,7 +85,7 @@
|
|||
#end
|
||||
#end
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3ReaderEx" )
|
||||
|
@ -29,7 +29,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Reader" )
|
||||
|
@ -29,7 +29,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Reader" )
|
||||
|
@ -29,7 +29,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,14 +16,14 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Transformer" )
|
||||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3WriterEx" )
|
||||
|
@ -29,7 +29,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
specific language governing permissions and limitations
|
||||
under the License.
|
||||
*#
|
||||
#parse ( "src/main/mdo/common.vm" )
|
||||
#parse ( "common.vm" )
|
||||
#
|
||||
#set ( $package = "${packageToolV4}" )
|
||||
#set ( $className = "${model.name}Xpp3Writer" )
|
||||
|
@ -29,7 +29,7 @@
|
|||
#
|
||||
#MODELLO-VELOCITY#SAVE-OUTPUT-TO ${package.replace('.','/')}/${className}.java
|
||||
// =================== DO NOT EDIT THIS FILE ====================
|
||||
// ${generatedBy}
|
||||
// Generated by Modello Velocity from ${template} template, any modifications will be overwritten.
|
||||
// ==============================================================
|
||||
package ${package};
|
||||
|
Loading…
Reference in New Issue