mirror of https://github.com/apache/maven.git
[MNG-7814] Use location tracking for settings (#1164)
This commit is contained in:
parent
e6303aae32
commit
0a8491c329
|
@ -19,12 +19,11 @@
|
||||||
package org.apache.maven.settings;
|
package org.apache.maven.settings;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.nio.file.Files;
|
||||||
import java.io.Reader;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
|
|
||||||
import org.apache.maven.settings.v4.SettingsXpp3Reader;
|
import org.apache.maven.api.settings.InputSource;
|
||||||
|
import org.apache.maven.settings.v4.SettingsXpp3ReaderEx;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
@ -43,8 +42,8 @@ void testValidGlobalSettings() throws Exception {
|
||||||
File globalSettingsFile = new File(basedir, "src/assembly/maven/conf/settings.xml");
|
File globalSettingsFile = new File(basedir, "src/assembly/maven/conf/settings.xml");
|
||||||
assertTrue(globalSettingsFile.isFile(), globalSettingsFile.getAbsolutePath());
|
assertTrue(globalSettingsFile.isFile(), globalSettingsFile.getAbsolutePath());
|
||||||
|
|
||||||
try (Reader reader = new InputStreamReader(new FileInputStream(globalSettingsFile), StandardCharsets.UTF_8)) {
|
try (InputStream is = Files.newInputStream(globalSettingsFile.toPath())) {
|
||||||
new SettingsXpp3Reader().read(reader);
|
new SettingsXpp3ReaderEx().read(is, true, new InputSource(globalSettingsFile.getAbsolutePath()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,7 @@ under the License.
|
||||||
</templates>
|
</templates>
|
||||||
<params>
|
<params>
|
||||||
<param>packageModelV4=org.apache.maven.api.settings</param>
|
<param>packageModelV4=org.apache.maven.api.settings</param>
|
||||||
|
<param>locationTracking=true</param>
|
||||||
</params>
|
</params>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
|
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.apache.maven.api.settings;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class InputLocation.
|
||||||
|
*/
|
||||||
|
public class InputLocation implements Serializable, InputLocationTracker {
|
||||||
|
private final int lineNumber;
|
||||||
|
private final int columnNumber;
|
||||||
|
private final InputSource source;
|
||||||
|
private final Map<Object, InputLocation> locations;
|
||||||
|
|
||||||
|
public InputLocation(InputSource source) {
|
||||||
|
this.lineNumber = -1;
|
||||||
|
this.columnNumber = -1;
|
||||||
|
this.source = source;
|
||||||
|
this.locations = Collections.singletonMap(0, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputLocation(int lineNumber, int columnNumber) {
|
||||||
|
this(lineNumber, columnNumber, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputLocation(int lineNumber, int columnNumber, InputSource source) {
|
||||||
|
this(lineNumber, columnNumber, source, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputLocation(int lineNumber, int columnNumber, InputSource source, Object selfLocationKey) {
|
||||||
|
this.lineNumber = lineNumber;
|
||||||
|
this.columnNumber = columnNumber;
|
||||||
|
this.source = source;
|
||||||
|
this.locations =
|
||||||
|
selfLocationKey != null ? Collections.singletonMap(selfLocationKey, this) : Collections.emptyMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputLocation(int lineNumber, int columnNumber, InputSource source, Map<Object, InputLocation> locations) {
|
||||||
|
this.lineNumber = lineNumber;
|
||||||
|
this.columnNumber = columnNumber;
|
||||||
|
this.source = source;
|
||||||
|
this.locations = ImmutableCollections.copy(locations);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLineNumber() {
|
||||||
|
return lineNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getColumnNumber() {
|
||||||
|
return columnNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputSource getSource() {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputLocation getLocation(Object key) {
|
||||||
|
return locations != null ? locations.get(key) : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<Object, InputLocation> getLocations() {
|
||||||
|
return locations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges the {@code source} location into the {@code target} location.
|
||||||
|
*
|
||||||
|
* @param target the target location
|
||||||
|
* @param source the source location
|
||||||
|
* @param sourceDominant the boolean indicating of {@code source} is dominant compared to {@code target}
|
||||||
|
* @return the merged location
|
||||||
|
*/
|
||||||
|
public static InputLocation merge(InputLocation target, InputLocation source, boolean sourceDominant) {
|
||||||
|
if (source == null) {
|
||||||
|
return target;
|
||||||
|
} else if (target == null) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Object, InputLocation> locations;
|
||||||
|
Map<Object, InputLocation> sourceLocations = source.locations;
|
||||||
|
Map<Object, InputLocation> targetLocations = target.locations;
|
||||||
|
if (sourceLocations == null) {
|
||||||
|
locations = targetLocations;
|
||||||
|
} else if (targetLocations == null) {
|
||||||
|
locations = sourceLocations;
|
||||||
|
} else {
|
||||||
|
locations = new LinkedHashMap<>();
|
||||||
|
locations.putAll(sourceDominant ? targetLocations : sourceLocations);
|
||||||
|
locations.putAll(sourceDominant ? sourceLocations : targetLocations);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new InputLocation(target.getLineNumber(), target.getColumnNumber(), target.getSource(), locations);
|
||||||
|
} // -- InputLocation merge( InputLocation, InputLocation, boolean )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Merges the {@code source} location into the {@code target} location.
|
||||||
|
* This method is used when the locations refer to lists and also merges the indices.
|
||||||
|
*
|
||||||
|
* @param target the target location
|
||||||
|
* @param source the source location
|
||||||
|
* @param indices the list of integers for the indices
|
||||||
|
* @return the merged location
|
||||||
|
*/
|
||||||
|
public static InputLocation merge(InputLocation target, InputLocation source, Collection<Integer> indices) {
|
||||||
|
if (source == null) {
|
||||||
|
return target;
|
||||||
|
} else if (target == null) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<Object, InputLocation> locations;
|
||||||
|
Map<Object, InputLocation> sourceLocations = source.locations;
|
||||||
|
Map<Object, InputLocation> targetLocations = target.locations;
|
||||||
|
if (sourceLocations == null) {
|
||||||
|
locations = targetLocations;
|
||||||
|
} else if (targetLocations == null) {
|
||||||
|
locations = sourceLocations;
|
||||||
|
} else {
|
||||||
|
locations = new LinkedHashMap<>();
|
||||||
|
for (int index : indices) {
|
||||||
|
InputLocation location;
|
||||||
|
if (index < 0) {
|
||||||
|
location = sourceLocations.get(~index);
|
||||||
|
} else {
|
||||||
|
location = targetLocations.get(index);
|
||||||
|
}
|
||||||
|
locations.put(locations.size(), location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new InputLocation(target.getLineNumber(), target.getColumnNumber(), target.getSource(), locations);
|
||||||
|
} // -- InputLocation merge( InputLocation, InputLocation, java.util.Collection )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class StringFormatter.
|
||||||
|
*
|
||||||
|
* @version $Revision$ $Date$
|
||||||
|
*/
|
||||||
|
public interface StringFormatter {
|
||||||
|
|
||||||
|
// -----------/
|
||||||
|
// - Methods -/
|
||||||
|
// -----------/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method toString.
|
||||||
|
*/
|
||||||
|
String toString(InputLocation location);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.apache.maven.api.settings;
|
||||||
|
|
||||||
|
public interface InputLocationTracker {
|
||||||
|
InputLocation getLocation(Object field);
|
||||||
|
}
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
package org.apache.maven.api.settings;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class InputSource.
|
||||||
|
*/
|
||||||
|
public class InputSource implements Serializable {
|
||||||
|
|
||||||
|
private final String location;
|
||||||
|
|
||||||
|
public InputSource(String location) {
|
||||||
|
this.location = location;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path/URL of the settings definition or {@code null} if unknown.
|
||||||
|
*
|
||||||
|
* @return the location
|
||||||
|
*/
|
||||||
|
public String getLocation() {
|
||||||
|
return this.location;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getLocation();
|
||||||
|
}
|
||||||
|
}
|
|
@ -266,7 +266,7 @@
|
||||||
</fields>
|
</fields>
|
||||||
<codeSegments>
|
<codeSegments>
|
||||||
<codeSegment>
|
<codeSegment>
|
||||||
<version>1.0.0+</version>
|
<version>1.0.0/1.2.0</version>
|
||||||
<code>
|
<code>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
public Boolean getInteractiveMode()
|
public Boolean getInteractiveMode()
|
||||||
|
@ -1082,5 +1082,55 @@
|
||||||
</fields>
|
</fields>
|
||||||
</class>
|
</class>
|
||||||
<!-- /BuildProfile support -->
|
<!-- /BuildProfile support -->
|
||||||
|
<class locationTracker="locations">
|
||||||
|
<name>InputLocation</name>
|
||||||
|
<version>2.0.0+</version>
|
||||||
|
<fields>
|
||||||
|
<!-- line, column and source fields are auto-generated by Modello -->
|
||||||
|
</fields>
|
||||||
|
<codeSegments>
|
||||||
|
<codeSegment>
|
||||||
|
<version>2.0.0+</version>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getLineNumber() + " : " + getColumnNumber() + ", " + getSource();
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</codeSegment>
|
||||||
|
</codeSegments>
|
||||||
|
</class>
|
||||||
|
<class sourceTracker="source">
|
||||||
|
<name>InputSource</name>
|
||||||
|
<version>2.0.0+</version>
|
||||||
|
<fields>
|
||||||
|
<field>
|
||||||
|
<name>location</name>
|
||||||
|
<version>2.0.0+</version>
|
||||||
|
<type>String</type>
|
||||||
|
<description>
|
||||||
|
<![CDATA[
|
||||||
|
The path/URL of the settings definition or {@code null} if unknown.
|
||||||
|
]]>
|
||||||
|
</description>
|
||||||
|
</field>
|
||||||
|
</fields>
|
||||||
|
<codeSegments>
|
||||||
|
<codeSegment>
|
||||||
|
<version>2.0.0+</version>
|
||||||
|
<code>
|
||||||
|
<![CDATA[
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return getLocation();
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</code>
|
||||||
|
</codeSegment>
|
||||||
|
</codeSegments>
|
||||||
|
</class>
|
||||||
</classes>
|
</classes>
|
||||||
</model>
|
</model>
|
||||||
|
|
|
@ -28,14 +28,14 @@
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.apache.maven.api.annotations.Nonnull;
|
import org.apache.maven.api.annotations.Nonnull;
|
||||||
import org.apache.maven.api.model.InputSource;
|
|
||||||
import org.apache.maven.api.services.xml.SettingsXmlFactory;
|
import org.apache.maven.api.services.xml.SettingsXmlFactory;
|
||||||
import org.apache.maven.api.services.xml.XmlReaderException;
|
import org.apache.maven.api.services.xml.XmlReaderException;
|
||||||
import org.apache.maven.api.services.xml.XmlReaderRequest;
|
import org.apache.maven.api.services.xml.XmlReaderRequest;
|
||||||
import org.apache.maven.api.services.xml.XmlWriterException;
|
import org.apache.maven.api.services.xml.XmlWriterException;
|
||||||
import org.apache.maven.api.services.xml.XmlWriterRequest;
|
import org.apache.maven.api.services.xml.XmlWriterRequest;
|
||||||
|
import org.apache.maven.api.settings.InputSource;
|
||||||
import org.apache.maven.api.settings.Settings;
|
import org.apache.maven.api.settings.Settings;
|
||||||
import org.apache.maven.settings.v4.SettingsXpp3Reader;
|
import org.apache.maven.settings.v4.SettingsXpp3ReaderEx;
|
||||||
import org.apache.maven.settings.v4.SettingsXpp3Writer;
|
import org.apache.maven.settings.v4.SettingsXpp3Writer;
|
||||||
|
|
||||||
@Named
|
@Named
|
||||||
|
@ -52,14 +52,14 @@ public Settings read(@Nonnull XmlReaderRequest request) throws XmlReaderExceptio
|
||||||
try {
|
try {
|
||||||
InputSource source = null;
|
InputSource source = null;
|
||||||
if (request.getModelId() != null || request.getLocation() != null) {
|
if (request.getModelId() != null || request.getLocation() != null) {
|
||||||
source = new InputSource(request.getModelId(), request.getLocation());
|
source = new InputSource(request.getLocation());
|
||||||
}
|
}
|
||||||
SettingsXpp3Reader xml = new SettingsXpp3Reader();
|
SettingsXpp3ReaderEx xml = new SettingsXpp3ReaderEx();
|
||||||
xml.setAddDefaultEntities(request.isAddDefaultEntities());
|
xml.setAddDefaultEntities(request.isAddDefaultEntities());
|
||||||
if (reader != null) {
|
if (reader != null) {
|
||||||
return xml.read(reader, request.isStrict());
|
return xml.read(reader, request.isStrict(), source);
|
||||||
} else {
|
} else {
|
||||||
return xml.read(inputStream, request.isStrict());
|
return xml.read(inputStream, request.isStrict(), source);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new XmlReaderException("Unable to read settings", e);
|
throw new XmlReaderException("Unable to read settings", e);
|
||||||
|
|
|
@ -24,12 +24,12 @@
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.StringReader;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.maven.api.settings.InputSource;
|
||||||
import org.apache.maven.building.FileSource;
|
import org.apache.maven.building.FileSource;
|
||||||
import org.apache.maven.building.Source;
|
import org.apache.maven.building.Source;
|
||||||
import org.apache.maven.settings.Server;
|
import org.apache.maven.settings.Server;
|
||||||
|
@ -39,6 +39,7 @@
|
||||||
import org.apache.maven.settings.io.SettingsReader;
|
import org.apache.maven.settings.io.SettingsReader;
|
||||||
import org.apache.maven.settings.io.SettingsWriter;
|
import org.apache.maven.settings.io.SettingsWriter;
|
||||||
import org.apache.maven.settings.merge.MavenSettingsMerger;
|
import org.apache.maven.settings.merge.MavenSettingsMerger;
|
||||||
|
import org.apache.maven.settings.v4.SettingsTransformer;
|
||||||
import org.apache.maven.settings.validation.SettingsValidator;
|
import org.apache.maven.settings.validation.SettingsValidator;
|
||||||
import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
|
import org.codehaus.plexus.interpolation.EnvarBasedValueSource;
|
||||||
import org.codehaus.plexus.interpolation.InterpolationException;
|
import org.codehaus.plexus.interpolation.InterpolationException;
|
||||||
|
@ -158,8 +159,9 @@ private Settings readSettings(
|
||||||
Settings settings;
|
Settings settings;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Map<String, ?> options = Collections.singletonMap(SettingsReader.IS_STRICT, Boolean.TRUE);
|
Map<String, Object> options = new HashMap<>();
|
||||||
|
options.put(SettingsReader.IS_STRICT, Boolean.TRUE);
|
||||||
|
options.put(InputSource.class.getName(), new InputSource(settingsSource.getLocation()));
|
||||||
try {
|
try {
|
||||||
settings = settingsReader.read(settingsSource.getInputStream(), options);
|
settings = settingsReader.read(settingsSource.getInputStream(), options);
|
||||||
} catch (SettingsParseException e) {
|
} catch (SettingsParseException e) {
|
||||||
|
@ -211,15 +213,6 @@ private Settings readSettings(
|
||||||
|
|
||||||
private Settings interpolate(
|
private Settings interpolate(
|
||||||
Settings settings, SettingsBuildingRequest request, SettingsProblemCollector problems) {
|
Settings settings, SettingsBuildingRequest request, SettingsProblemCollector problems) {
|
||||||
StringWriter writer = new StringWriter(1024 * 4);
|
|
||||||
|
|
||||||
try {
|
|
||||||
settingsWriter.write(writer, null, settings);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new IllegalStateException("Failed to serialize settings to memory", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
String serializedSettings = writer.toString();
|
|
||||||
|
|
||||||
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
|
RegexBasedInterpolator interpolator = new RegexBasedInterpolator();
|
||||||
|
|
||||||
|
@ -238,37 +231,19 @@ private Settings interpolate(
|
||||||
e);
|
e);
|
||||||
}
|
}
|
||||||
|
|
||||||
interpolator.addPostProcessor((expression, value) -> {
|
return new Settings(new SettingsTransformer(value -> {
|
||||||
if (value != null) {
|
try {
|
||||||
// we're going to parse this back in as XML so we need to escape XML markup
|
return value != null ? interpolator.interpolate(value) : null;
|
||||||
value = value.toString()
|
} catch (InterpolationException e) {
|
||||||
.replace("&", "&")
|
problems.add(
|
||||||
.replace("<", "<")
|
SettingsProblem.Severity.WARNING,
|
||||||
.replace(">", ">");
|
"Failed to interpolate settings: " + e.getMessage(),
|
||||||
return value;
|
-1,
|
||||||
}
|
-1,
|
||||||
return null;
|
e);
|
||||||
});
|
return value;
|
||||||
|
}
|
||||||
try {
|
})
|
||||||
serializedSettings = interpolator.interpolate(serializedSettings, "settings");
|
.visit(settings.getDelegate()));
|
||||||
} catch (InterpolationException e) {
|
|
||||||
problems.add(
|
|
||||||
SettingsProblem.Severity.ERROR, "Failed to interpolate settings: " + e.getMessage(), -1, -1, e);
|
|
||||||
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
Settings result;
|
|
||||||
try {
|
|
||||||
Map<String, ?> options = Collections.singletonMap(SettingsReader.IS_STRICT, Boolean.FALSE);
|
|
||||||
result = settingsReader.read(new StringReader(serializedSettings), options);
|
|
||||||
} catch (IOException e) {
|
|
||||||
problems.add(
|
|
||||||
SettingsProblem.Severity.ERROR, "Failed to interpolate settings: " + e.getMessage(), -1, -1, e);
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,9 @@
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.apache.maven.api.settings.InputSource;
|
||||||
import org.apache.maven.settings.Settings;
|
import org.apache.maven.settings.Settings;
|
||||||
import org.apache.maven.settings.v4.SettingsXpp3Reader;
|
import org.apache.maven.settings.v4.SettingsXpp3ReaderEx;
|
||||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -47,7 +48,8 @@ public Settings read(File input, Map<String, ?> options) throws IOException {
|
||||||
Objects.requireNonNull(input, "input cannot be null");
|
Objects.requireNonNull(input, "input cannot be null");
|
||||||
|
|
||||||
try (InputStream in = Files.newInputStream(input.toPath())) {
|
try (InputStream in = Files.newInputStream(input.toPath())) {
|
||||||
return new Settings(new SettingsXpp3Reader().read(in, isStrict(options)));
|
InputSource source = new InputSource(input.toString());
|
||||||
|
return new Settings(new SettingsXpp3ReaderEx().read(in, isStrict(options), source));
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
||||||
}
|
}
|
||||||
|
@ -58,7 +60,8 @@ public Settings read(Reader input, Map<String, ?> options) throws IOException {
|
||||||
Objects.requireNonNull(input, "input cannot be null");
|
Objects.requireNonNull(input, "input cannot be null");
|
||||||
|
|
||||||
try (Reader in = input) {
|
try (Reader in = input) {
|
||||||
return new Settings(new SettingsXpp3Reader().read(in, isStrict(options)));
|
InputSource source = (InputSource) options.get(InputSource.class.getName());
|
||||||
|
return new Settings(new SettingsXpp3ReaderEx().read(in, isStrict(options), source));
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
||||||
}
|
}
|
||||||
|
@ -69,7 +72,8 @@ public Settings read(InputStream input, Map<String, ?> options) throws IOExcepti
|
||||||
Objects.requireNonNull(input, "input cannot be null");
|
Objects.requireNonNull(input, "input cannot be null");
|
||||||
|
|
||||||
try (InputStream in = input) {
|
try (InputStream in = input) {
|
||||||
return new Settings(new SettingsXpp3Reader().read(in, isStrict(options)));
|
InputSource source = (InputSource) options.get(InputSource.class.getName());
|
||||||
|
return new Settings(new SettingsXpp3ReaderEx().read(in, isStrict(options), source));
|
||||||
} catch (XmlPullParserException e) {
|
} catch (XmlPullParserException e) {
|
||||||
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
throw new SettingsParseException(e.getMessage(), e.getLineNumber(), e.getColumnNumber(), e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,6 +60,11 @@ under the License.
|
||||||
<models>
|
<models>
|
||||||
<model>src/main/mdo/settings.mdo</model>
|
<model>src/main/mdo/settings.mdo</model>
|
||||||
</models>
|
</models>
|
||||||
|
<params>
|
||||||
|
<param>packageModelV3=org.apache.maven.settings</param>
|
||||||
|
<param>packageModelV4=org.apache.maven.api.settings</param>
|
||||||
|
<param>packageToolV4=org.apache.maven.settings.v4</param>
|
||||||
|
</params>
|
||||||
</configuration>
|
</configuration>
|
||||||
<executions>
|
<executions>
|
||||||
<execution>
|
<execution>
|
||||||
|
@ -70,18 +75,31 @@ under the License.
|
||||||
<phase>generate-sources</phase>
|
<phase>generate-sources</phase>
|
||||||
<configuration>
|
<configuration>
|
||||||
<templates>
|
<templates>
|
||||||
<template>model-v3.vm</template>
|
|
||||||
<template>merger.vm</template>
|
<template>merger.vm</template>
|
||||||
|
<template>transformer.vm</template>
|
||||||
<template>reader.vm</template>
|
<template>reader.vm</template>
|
||||||
|
<template>reader-ex.vm</template>
|
||||||
<template>writer.vm</template>
|
<template>writer.vm</template>
|
||||||
|
<template>writer-ex.vm</template>
|
||||||
</templates>
|
</templates>
|
||||||
<params>
|
<params combine.children="append">
|
||||||
<param>packageModelV3=org.apache.maven.settings</param>
|
<param>locationTracking=true</param>
|
||||||
<param>packageModelV4=org.apache.maven.api.settings</param>
|
|
||||||
<param>packageToolV4=org.apache.maven.settings.v4</param>
|
|
||||||
</params>
|
</params>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
<execution>
|
||||||
|
<id>v3</id>
|
||||||
|
<goals>
|
||||||
|
<goal>velocity</goal>
|
||||||
|
</goals>
|
||||||
|
<phase>generate-sources</phase>
|
||||||
|
<configuration>
|
||||||
|
<version>1.2.0</version>
|
||||||
|
<templates>
|
||||||
|
<template>model-v3.vm</template>
|
||||||
|
</templates>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
<plugin>
|
<plugin>
|
||||||
|
|
|
@ -183,9 +183,17 @@ public class ${class.name}
|
||||||
|
|
||||||
public void set${cap}(${type} ${field.name}) {
|
public void set${cap}(${type} ${field.name}) {
|
||||||
#if ($field.type == "DOM")
|
#if ($field.type == "DOM")
|
||||||
if (!Objects.equals(((Xpp3Dom) ${field.name}).getDom(), getDelegate().${pfx}${cap}())) {
|
if (${field.name} instanceof Xpp3Dom) {
|
||||||
update(getDelegate().with${cap}(((Xpp3Dom) ${field.name}).getDom()));
|
if (!Objects.equals(((Xpp3Dom) ${field.name}).getDom(), getDelegate().${pfx}${cap}())) {
|
||||||
((Xpp3Dom) ${field.name}).setChildrenTracking(this::replace);
|
update(getDelegate().with${cap}(((Xpp3Dom) ${field.name}).getDom()));
|
||||||
|
((Xpp3Dom) ${field.name}).setChildrenTracking(this::replace);
|
||||||
|
}
|
||||||
|
} else if (${field.name} == null) {
|
||||||
|
if (getDelegate().${pfx}${cap}() != null) {
|
||||||
|
update(getDelegate().with${cap}(null));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Expected an Xpp3Dom object but received: " + ${field.name});
|
||||||
}
|
}
|
||||||
#elseif( $field.type == "java.util.Properties" )
|
#elseif( $field.type == "java.util.Properties" )
|
||||||
Map<String, String> map = ${field.name}.entrySet().stream()
|
Map<String, String> map = ${field.name}.entrySet().stream()
|
||||||
|
@ -194,7 +202,7 @@ public class ${class.name}
|
||||||
update(getDelegate().with${cap}(map));
|
update(getDelegate().with${cap}(map));
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (!Objects.equals(${field.name}, getDelegate().${pfx}${cap}())) {
|
if (!Objects.equals(${field.name}, ${pfx}${cap}())) {
|
||||||
#if ( $field.to != "String" && $field.type == "java.util.List" && $field.multiplicity == "*" )
|
#if ( $field.to != "String" && $field.type == "java.util.List" && $field.multiplicity == "*" )
|
||||||
update(getDelegate().with${cap}(
|
update(getDelegate().with${cap}(
|
||||||
${field.name}.stream().map(c -> c.getDelegate()).collect(Collectors.toList())));
|
${field.name}.stream().map(c -> c.getDelegate()).collect(Collectors.toList())));
|
||||||
|
|
|
@ -73,414 +73,6 @@ public class ${className} {
|
||||||
this.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, false);
|
|
||||||
} //-- 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, boolean defaultValue)
|
|
||||||
throws XmlPullParserException {
|
|
||||||
if (s != null && s.length() != 0) {
|
|
||||||
return Boolean.valueOf(s).booleanValue();
|
|
||||||
}
|
|
||||||
return defaultValue;
|
|
||||||
} //-- 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
|
* @see ReaderFactory#newXmlReader
|
||||||
*
|
*
|
||||||
|
@ -771,4 +363,412 @@ public class ${className} {
|
||||||
String transform(String source, String fieldName);
|
String transform(String source, String fieldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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, false);
|
||||||
|
} //-- 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, boolean defaultValue)
|
||||||
|
throws XmlPullParserException {
|
||||||
|
if (s != null && s.length() != 0) {
|
||||||
|
return Boolean.valueOf(s).booleanValue();
|
||||||
|
}
|
||||||
|
return defaultValue;
|
||||||
|
} //-- 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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue