This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.fsresource-1.3.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-fsresource.git
commit 2ea88527670a02516ee6f8317ce40d6e50847e63 Author: Stefan Seifert <[email protected]> AuthorDate: Thu Mar 2 17:39:13 2017 +0000 SLING-6440 switch to fscontentparser rename "Filesystem" to "File System" update to latest parent git-svn-id: https://svn.apache.org/repos/asf/sling/branches/fsresource-1.1.x@1785170 13f79535-47bb-0310-9956-ffa450edef68 --- pom.xml | 44 ++---- .../fsprovider/internal/FsResourceProvider.java | 8 +- .../fsprovider/internal/mapper/FileResource.java | 2 +- .../fsprovider/internal/mapper/ValueMapUtil.java | 7 - .../internal/parser/ContentFileCache.java | 2 +- ...tFileParser.java => ContentFileParserUtil.java} | 27 +++- .../internal/parser/ContentFileTypes.java | 6 +- .../internal/parser/JcrXmlFileParser.java | 147 ------------------ .../internal/parser/JcrXmlValueConverter.java | 168 --------------------- .../fsprovider/internal/parser/JsonFileParser.java | 125 --------------- .../fsprovider/internal/JcrXmlContentTest.java | 10 +- .../sling/fsprovider/internal/JsonContentTest.java | 15 +- ...serTest.java => ContentFileParserUtilTest.java} | 10 +- .../internal/parser/JcrXmlFileParserTest.java | 34 ----- .../internal/parser/JcrXmlValueConverterTest.java | 105 ------------- 15 files changed, 62 insertions(+), 648 deletions(-) diff --git a/pom.xml b/pom.xml index c871b0c..5db693f 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ <parent> <groupId>org.apache.sling</groupId> <artifactId>sling</artifactId> - <version>29</version> + <version>30-SNAPSHOT</version> <relativePath /> </parent> @@ -30,10 +30,9 @@ <packaging>bundle</packaging> <version>1.1.5-SNAPSHOT</version> - <name>Apache Sling Filesystem Resource Provider</name> + <name>Apache Sling File System Resource Provider</name> <description> - Provides a ResourceProvider implementation supporting filesystem - based resources. + Provides a ResourceProvider implementation supporting file system based resources. </description> <scm> @@ -61,33 +60,14 @@ <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <extensions>true</extensions> - <executions> - <!-- Configure extra execution of 'manifest' in process-classes phase to make sure SCR metadata is generated before unit test runs --> - <execution> - <id>scr-metadata</id> - <goals> - <goal>manifest</goal> - </goals> - <configuration> - <supportIncrementalBuild>true</supportIncrementalBuild> - </configuration> - </execution> - </executions> <configuration> - <!-- Export SCR metadata to classpath to have them available in unit tests --> - <exportScr>true</exportScr> <instructions> - <!-- Embed Apache Johnzon --> + <!-- Embed Apache Johnzon and fscontentparser --> <Embed-Dependency> johnzon-core;scope=compile;inline=false, - geronimo-json_1.0_spec;scope=compile;inline=false + geronimo-json_1.0_spec;scope=compile;inline=false, + org.apache.sling.fscontentparser;scope=compile;inline=false </Embed-Dependency> - <!-- Embed the nessecary parts of the jackrabbit-jcr-commons bundle as described in http://njbartlett.name/2014/05/26/static-linking.html --> - <Conditional-Package>org.apache.jackrabbit.util</Conditional-Package> - <Import-Package> - !org.apache.jackrabbit.*, - * - </Import-Package> </instructions> </configuration> </plugin> @@ -154,18 +134,18 @@ <scope>compile</scope> </dependency> <dependency> - <groupId>org.apache.jackrabbit</groupId> - <artifactId>jackrabbit-jcr-commons</artifactId> - <version>2.8.0</version> - <scope>compile</scope> - </dependency> - <dependency> <groupId>org.apache.sling</groupId> <artifactId>adapter-annotations</artifactId> <version>1.0.0</version> <scope>provided</scope> </dependency> <dependency> + <groupId>org.apache.sling</groupId> + <artifactId>org.apache.sling.fscontentparser</artifactId> + <version>1.0.0-SNAPSHOT</version> + <scope>compile</scope> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> diff --git a/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java b/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java index e3e3bad..12e5bf2 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/FsResourceProvider.java @@ -66,13 +66,13 @@ import org.osgi.service.metatype.annotations.ObjectClassDefinition; service=ResourceProvider.class, configurationPolicy=ConfigurationPolicy.REQUIRE, property={ - Constants.SERVICE_DESCRIPTION + "=Sling Filesystem Resource Provider", + Constants.SERVICE_DESCRIPTION + "=Sling File System Resource Provider", Constants.SERVICE_VENDOR + "=The Apache Software Foundation" }) @Designate(ocd=FsResourceProvider.Config.class, factory=true) public final class FsResourceProvider implements ResourceProvider { - @ObjectClassDefinition(name = "Apache Sling Filesystem Resource Provider", + @ObjectClassDefinition(name = "Apache Sling File System Resource Provider", description = "Configure an instance of the filesystem " + "resource provider in terms of provider root and filesystem location") public @interface Config { @@ -81,8 +81,8 @@ public final class FsResourceProvider implements ResourceProvider { * files and folders mapped into the resource tree (value is * "provider.file"). */ - @AttributeDefinition(name = "Filesystem Root", - description = "Filesystem directory mapped to the virtual " + + @AttributeDefinition(name = "File System Root", + description = "File system directory mapped to the virtual " + "resource tree. This property must not be an empty string. If the path is " + "relative it is resolved against sling.home or the current working directory. " + "The path may be a file or folder. If the path does not address an existing " + diff --git a/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java b/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java index 67cd178..e3a61ac 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/mapper/FileResource.java @@ -81,7 +81,7 @@ public final class FileResource extends AbstractResource { private static final Logger log = LoggerFactory.getLogger(FileResource.class); /** - * Creates an instance of this Filesystem resource. + * Creates an instance of this File system resource. * * @param resolver The owning resource resolver * @param resourcePath The resource path in the resource tree diff --git a/src/main/java/org/apache/sling/fsprovider/internal/mapper/ValueMapUtil.java b/src/main/java/org/apache/sling/fsprovider/internal/mapper/ValueMapUtil.java index 8ddbda7..0d12ee1 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/mapper/ValueMapUtil.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/mapper/ValueMapUtil.java @@ -22,8 +22,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; -import javax.jcr.nodetype.NodeType; - import org.apache.sling.api.resource.ValueMap; import org.apache.sling.api.wrappers.ValueMapDecorator; @@ -55,11 +53,6 @@ final class ValueMapUtil { } } - // fallback to default jcr:primaryType is none is set - if (!props.containsKey("jcr:primaryType")) { - props.put("jcr:primaryType", NodeType.NT_UNSTRUCTURED); - } - return new ValueMapDecorator(props); } diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileCache.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileCache.java index 289fb67..745ae60 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileCache.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileCache.java @@ -57,7 +57,7 @@ public final class ContentFileCache { content = contentCache.get(path); } if (content == null) { - content = ContentFileParser.parse(file); + content = ContentFileParserUtil.parse(file); if (content == null) { content = NULL_MAP; } diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParser.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java similarity index 63% rename from src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParser.java rename to src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java index 81a69a3..ec9af59 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParser.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtil.java @@ -25,17 +25,34 @@ import java.io.File; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import org.apache.sling.fscontentparser.ContentFileExtension; +import org.apache.sling.fscontentparser.ContentFileParser; +import org.apache.sling.fscontentparser.ContentFileParserFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Parses files that contains content fragments (e.g. JSON, JCR XML). */ -class ContentFileParser { +class ContentFileParserUtil { - private static final Logger log = LoggerFactory.getLogger(ContentFileParser.class); + private static final Logger log = LoggerFactory.getLogger(ContentFileParserUtil.class); - private ContentFileParser() { + private static final ContentFileParser JSON_PARSER; + static { + // workaround for JsonProvider classloader issue until https://issues.apache.org/jira/browse/GERONIMO-6560 is fixed + ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); + try { + Thread.currentThread().setContextClassLoader(ContentFileParserUtil.class.getClassLoader()); + JSON_PARSER = ContentFileParserFactory.create(ContentFileExtension.JSON); + } + finally { + Thread.currentThread().setContextClassLoader(oldClassLoader); + } + } + private static final ContentFileParser JCR_XML_PARSER = ContentFileParserFactory.create(ContentFileExtension.JCR_XML); + + private ContentFileParserUtil() { // static methods only } @@ -47,10 +64,10 @@ class ContentFileParser { public static Map<String,Object> parse(File file) { try { if (StringUtils.endsWith(file.getName(), JSON_SUFFIX)) { - return JsonFileParser.parse(file); + return JSON_PARSER.parse(file); } else if (StringUtils.endsWith(file.getName(), JCR_XML_SUFFIX)) { - return JcrXmlFileParser.parse(file); + return JCR_XML_PARSER.parse(file); } } catch (Throwable ex) { diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java index 85e6445..689654d 100644 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java +++ b/src/main/java/org/apache/sling/fsprovider/internal/parser/ContentFileTypes.java @@ -18,6 +18,8 @@ */ package org.apache.sling.fsprovider.internal.parser; +import org.apache.sling.fscontentparser.ContentFileExtension; + /** * Content file types. */ @@ -26,12 +28,12 @@ public final class ContentFileTypes { /** * JSON content files. */ - public static final String JSON_SUFFIX = ".json"; + public static final String JSON_SUFFIX = "." + ContentFileExtension.JSON; /** * JCR XML content files. */ - public static final String JCR_XML_SUFFIX = ".jcr.xml"; + public static final String JCR_XML_SUFFIX = "." + ContentFileExtension.JCR_XML; private ContentFileTypes() { // static methods only diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParser.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParser.java deleted file mode 100644 index 6174bf9..0000000 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParser.java +++ /dev/null @@ -1,147 +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. - */ -package org.apache.sling.fsprovider.internal.parser; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Stack; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; - -import org.apache.jackrabbit.util.ISO9075; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.xml.sax.Attributes; -import org.xml.sax.SAXException; -import org.xml.sax.SAXParseException; -import org.xml.sax.helpers.DefaultHandler; - -/** - * Parses JCR XML files that contains content fragments. - */ -class JcrXmlFileParser { - - private static final Logger log = LoggerFactory.getLogger(JcrXmlFileParser.class); - - private static final SAXParserFactory SAX_PARSER_FACTORY; - static { - SAX_PARSER_FACTORY = SAXParserFactory.newInstance(); - SAX_PARSER_FACTORY.setNamespaceAware(true); - } - - private JcrXmlFileParser() { - // static methods only - } - - /** - * Parse JSON file. - * @param file File - * @return Content - */ - public static Map<String,Object> parse(File file) { - log.debug("Parse JCR XML content from {}", file.getPath()); - try (FileInputStream fis = new FileInputStream(file)) { - XmlHandler xmlHandler = new XmlHandler(); - SAXParser parser = SAX_PARSER_FACTORY.newSAXParser(); - parser.parse(fis, xmlHandler); - if (xmlHandler.hasError()) { - throw xmlHandler.getError(); - } - return xmlHandler.getContent(); - } - catch (IOException | ParserConfigurationException | SAXException ex) { - log.warn("Error parsing JCR XML content from " + file.getPath(), ex); - return null; - } - } - - /** - * Decodes element or attribute names. - * @param qname qname - * @return Decoded name - */ - static String decodeName(String qname) { - return ISO9075.decode(qname); - } - - /** - * Parses XML stream to Map. - */ - static class XmlHandler extends DefaultHandler { - private final Map<String,Object> content = new LinkedHashMap<>(); - private final Stack<Map<String,Object>> elements = new Stack<>(); - private SAXParseException error; - - public Map<String,Object> getContent() { - return content; - } - - public boolean hasError() { - return error != null; - } - - public SAXParseException getError() { - return error; - } - - @Override - public void startElement(String uri, String localName, String qName, Attributes attributes) - throws SAXException { - - // prepare map for element - Map<String,Object> element; - if (elements.isEmpty()) { - element = content; - } - else { - element = new HashMap<>(); - elements.peek().put(decodeName(qName), element); - } - elements.push(element); - - // get attributes - for (int i=0; i<attributes.getLength(); i++) { - element.put(decodeName(attributes.getQName(i)), JcrXmlValueConverter.parseValue(attributes.getValue(i))); - } - } - - @Override - public void endElement(String uri, String localName, String qName) throws SAXException { - elements.pop(); - } - - @Override - public void error(SAXParseException ex) throws SAXException { - this.error = ex; - } - - @Override - public void fatalError(SAXParseException ex) throws SAXException { - this.error = ex; - } - - } - -} diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverter.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverter.java deleted file mode 100644 index 8a0d0db..0000000 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverter.java +++ /dev/null @@ -1,168 +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. - */ -package org.apache.sling.fsprovider.internal.parser; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.jackrabbit.util.ISO8601; - -/** - * Parses JCR XML files that contains content fragments. - */ -class JcrXmlValueConverter { - - private static final Pattern TYPE_PREFIX = Pattern.compile("^\\{([^\\{\\}]+)\\}(.+)$"); - private static final Pattern VALUE_ARRAY = Pattern.compile("^\\[(.*)\\]$"); - - private JcrXmlValueConverter() { - // static methods only - } - - /** - * Parse JSON value from XML Attribute. - * @param value XML attribute value - * @return Value object - */ - public static Object parseValue(final String rawValue) { - String value = rawValue; - String[] valueArray = null; - - if (rawValue == null) { - return null; - } - - // detect type prefix - String typePrefix = null; - Matcher typePrefixMatcher = TYPE_PREFIX.matcher(value); - if (typePrefixMatcher.matches()) { - typePrefix = typePrefixMatcher.group(1); - value = typePrefixMatcher.group(2); - } - - // check for array - Matcher arrayMatcher = VALUE_ARRAY.matcher(value); - if (arrayMatcher.matches()) { - value = null; - valueArray = splitPreserveAllTokens(arrayMatcher.group(1), ','); - } - - // convert values - if (valueArray != null) { - Object[] result = new Object[valueArray.length]; - for (int i=0; i<valueArray.length; i++) { - result[i] = convertValue(valueArray[i], typePrefix, true); - } - return result; - } - else { - return convertValue(value, typePrefix, false); - } - } - - /** - * Split string preserving all tokens - but ignore separators that are escaped with \. - * @param str Combined string - * @param sep Separator - * @return Tokens - */ - private static String[] splitPreserveAllTokens(String str, char sep) { - final int len = str.length(); - if (len == 0) { - return ArrayUtils.EMPTY_STRING_ARRAY; - } - final List<String> list = new ArrayList<String>(); - int i = 0, start = 0; - boolean match = false; - boolean lastMatch = false; - boolean escaped = false; - while (i < len) { - if (str.charAt(i) == '\\' && !escaped) { - escaped = true; - } - else { - if (str.charAt(i) == sep && !escaped) { - lastMatch = true; - list.add(str.substring(start, i)); - match = false; - start = ++i; - continue; - } - lastMatch = false; - match = true; - escaped = false; - } - i++; - } - if (match || lastMatch) { - list.add(str.substring(start, i)); - } - return list.toArray(new String[list.size()]); - } - - /** - * Parse value depending on type prefix. - * @param value Value - * @param typePrefix Type prefix - * @param inArray Value is in array - * @return Value object - */ - private static Object convertValue(final String value, final String typePrefix, final boolean inArray) { - if (typePrefix == null || StringUtils.equals(typePrefix, "Name")) { - return deescapeStringValue(value, inArray); - } - else if (StringUtils.equals(typePrefix, "Boolean")) { - return Boolean.valueOf(value); - } - else if (StringUtils.equals(typePrefix, "Long")) { - return Long.valueOf(value); - } - else if (StringUtils.equals(typePrefix, "Decimal")) { - return Double.valueOf(value); - } - else if (StringUtils.equals(typePrefix, "Date")) { - return ISO8601.parse(value); - } - else { - throw new IllegalArgumentException("Unexpected type prefix: " + typePrefix); - } - } - - /** - * De-escape string value. - * @param value Escaped string value - * @param inArray In array - * @return De-escaped string value - */ - private static String deescapeStringValue(final String value, final boolean inArray) { - String descapedValue = value; - if (inArray) { - descapedValue = StringUtils.replace(descapedValue, "\\,", ","); - } - else if (StringUtils.startsWith(descapedValue, "\\{") || StringUtils.startsWith(descapedValue, "\\[")) { - descapedValue = descapedValue.substring(1); - } - return StringUtils.replace(descapedValue, "\\\\", "\\"); - } - -} diff --git a/src/main/java/org/apache/sling/fsprovider/internal/parser/JsonFileParser.java b/src/main/java/org/apache/sling/fsprovider/internal/parser/JsonFileParser.java deleted file mode 100644 index 8070e0d..0000000 --- a/src/main/java/org/apache/sling/fsprovider/internal/parser/JsonFileParser.java +++ /dev/null @@ -1,125 +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. - */ -package org.apache.sling.fsprovider.internal.parser; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.json.Json; -import javax.json.JsonArray; -import javax.json.JsonNumber; -import javax.json.JsonObject; -import javax.json.JsonReader; -import javax.json.JsonReaderFactory; -import javax.json.JsonString; -import javax.json.JsonValue; -import javax.json.stream.JsonParsingException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Parses JSON files that contains content fragments. - */ -class JsonFileParser { - - private static final Logger log = LoggerFactory.getLogger(JsonFileParser.class); - - private static final JsonReaderFactory JSON_READER_FACTORY; - static { - // allow comments in JSON files - Map<String,Object> jsonReaderFactoryConfig = new HashMap<>(); - jsonReaderFactoryConfig.put("org.apache.johnzon.supports-comments", true); - // workaround for JsonProvider classloader issue until https://issues.apache.org/jira/browse/GERONIMO-6560 is fixed - ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader(); - try { - Thread.currentThread().setContextClassLoader(JsonFileParser.class.getClassLoader()); - JSON_READER_FACTORY = Json.createReaderFactory(jsonReaderFactoryConfig); - } - finally { - Thread.currentThread().setContextClassLoader(oldClassLoader); - } - } - - private JsonFileParser() { - // static methods only - } - - /** - * Parse JSON file. - * @param file File - * @return Content - */ - public static Map<String,Object> parse(File file) { - log.debug("Parse JSON content from {}", file.getPath()); - try (FileInputStream fis = new FileInputStream(file); - JsonReader reader = JSON_READER_FACTORY.createReader(fis)) { - return toMap(reader.readObject()); - } - catch (IOException | JsonParsingException ex) { - log.warn("Error parsing JSON content from " + file.getPath(), ex); - return null; - } - } - - private static Map<String,Object> toMap(JsonObject object) { - Map<String,Object> map = new LinkedHashMap<>(); - for (Map.Entry<String, JsonValue> entry : object.entrySet()) { - map.put(entry.getKey(), convertValue(entry.getValue())); - } - return map; - } - - private static Object convertValue(JsonValue value) { - switch (value.getValueType()) { - case STRING: - return ((JsonString)value).getString(); - case NUMBER: - JsonNumber numberValue = (JsonNumber)value; - if (numberValue.isIntegral()) { - return numberValue.longValue(); - } - else { - return numberValue.doubleValue(); - } - case TRUE: - return true; - case FALSE: - return false; - case NULL: - return null; - case ARRAY: - JsonArray arrayValue = (JsonArray)value; - Object[] values = new Object[arrayValue.size()]; - for (int i=0; i<values.length; i++) { - values[i] = convertValue(arrayValue.get(i)); - } - return values; - case OBJECT: - return toMap((JsonObject)value); - default: - throw new IllegalArgumentException("Unexpected JSON value type: " + value.getValueType()); - } - } - -} diff --git a/src/test/java/org/apache/sling/fsprovider/internal/JcrXmlContentTest.java b/src/test/java/org/apache/sling/fsprovider/internal/JcrXmlContentTest.java index 3325ed4..d928205 100644 --- a/src/test/java/org/apache/sling/fsprovider/internal/JcrXmlContentTest.java +++ b/src/test/java/org/apache/sling/fsprovider/internal/JcrXmlContentTest.java @@ -92,7 +92,7 @@ public class JcrXmlContentTest { } @Test - public void testJsonContent_Root() { + public void testContent_Root() { Resource underTest = fsroot.getChild("folder3/content"); assertNotNull(underTest); assertEquals("app:Page", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -101,7 +101,7 @@ public class JcrXmlContentTest { } @Test - public void testJsonContent_Level1() { + public void testContent_Level1() { Resource underTest = fsroot.getChild("folder3/content/jcr:content"); assertNotNull(underTest); assertEquals("app:PageContent", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -110,7 +110,7 @@ public class JcrXmlContentTest { } @Test - public void testJsonContent_Level3() { + public void testContent_Level3() { Resource underTest = fsroot.getChild("folder3/content/jcr:content/content/contentheadline"); assertNotNull(underTest); assertEquals("nt:unstructured", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -119,7 +119,7 @@ public class JcrXmlContentTest { } @Test - public void testJsonContent_Datatypes() { + public void testContent_Datatypes() { Resource underTest = fsroot.getChild("folder3/content/jcr:content"); ValueMap props = ResourceUtil.getValueMap(underTest); @@ -133,7 +133,7 @@ public class JcrXmlContentTest { } @Test - public void testJsonContent_InvalidPath() { + public void testContent_InvalidPath() { Resource underTest = fsroot.getChild("folder2/content/jcr:content/xyz"); assertNull(underTest); } diff --git a/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java b/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java index 7aa29aa..04a9418 100644 --- a/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java +++ b/src/test/java/org/apache/sling/fsprovider/internal/JsonContentTest.java @@ -43,6 +43,7 @@ import javax.jcr.nodetype.NodeType; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.fscontentparser.ParserOptions; import org.apache.sling.fsprovider.internal.TestUtils.RegisterFsResourcePlugin; import org.apache.sling.hamcrest.ResourceMatchers; import org.apache.sling.testing.mock.sling.ResourceResolverType; @@ -101,7 +102,7 @@ public class JsonContentTest { } @Test - public void testJsonContent_Root() { + public void testContent_Root() { Resource underTest = fsroot.getChild("folder2/content"); assertNotNull(underTest); assertEquals("app:Page", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -110,7 +111,7 @@ public class JsonContentTest { } @Test - public void testJsonContent_Level1() { + public void testContent_Level1() { Resource underTest = fsroot.getChild("folder2/content/jcr:content"); assertNotNull(underTest); assertEquals("app:PageContent", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -120,7 +121,7 @@ public class JsonContentTest { } @Test - public void testJsonContent_Level5() { + public void testContent_Level5() { Resource underTest = fsroot.getChild("folder2/content/jcr:content/par/image/file/jcr:content"); assertNotNull(underTest); assertEquals("nt:resource", ResourceUtil.getValueMap(underTest).get("jcr:primaryType", String.class)); @@ -128,7 +129,7 @@ public class JsonContentTest { } @Test - public void testJsonContent_Datatypes() { + public void testContent_Datatypes() { Resource underTest = fsroot.getChild("folder2/content/toolbar/profiles/jcr:content"); ValueMap props = ResourceUtil.getValueMap(underTest); @@ -142,7 +143,7 @@ public class JsonContentTest { } @Test - public void testJsonContent_Datatypes_JCR() throws RepositoryException { + public void testContent_Datatypes_JCR() throws RepositoryException { Resource underTest = fsroot.getChild("folder2/content/toolbar/profiles/jcr:content"); ValueMap props = ResourceUtil.getValueMap(underTest); Node node = underTest.adaptTo(Node.class); @@ -220,11 +221,11 @@ public class JsonContentTest { @Test public void testFallbackNodeType() throws RepositoryException { Resource underTest = fsroot.getChild("folder2/content/jcr:content/par/title_2"); - assertEquals(NodeType.NT_UNSTRUCTURED, underTest.adaptTo(Node.class).getPrimaryNodeType().getName()); + assertEquals(ParserOptions.DEFAULT_PRIMARY_TYPE, underTest.adaptTo(Node.class).getPrimaryNodeType().getName()); } @Test - public void testJsonContent_InvalidPath() { + public void testContent_InvalidPath() { Resource underTest = fsroot.getChild("folder2/content/jcr:content/xyz"); assertNull(underTest); } diff --git a/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserTest.java b/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java similarity index 86% rename from src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserTest.java rename to src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java index 290ea21..9bdaa51 100644 --- a/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserTest.java +++ b/src/test/java/org/apache/sling/fsprovider/internal/parser/ContentFileParserUtilTest.java @@ -27,13 +27,13 @@ import java.util.Map; import org.junit.Test; -public class ContentFileParserTest { +public class ContentFileParserUtilTest { @SuppressWarnings("unchecked") @Test public void testParseJson() { File file = new File("src/test/resources/fs-test/folder2/content.json"); - Map<String,Object> content = ContentFileParser.parse(file); + Map<String,Object> content = ContentFileParserUtil.parse(file); assertNotNull(content); assertEquals("app:Page", content.get("jcr:primaryType")); assertEquals("app:PageContent", ((Map<String,Object>)content.get("jcr:content")).get("jcr:primaryType")); @@ -42,7 +42,7 @@ public class ContentFileParserTest { @Test public void testParseInvalidJson() { File file = new File("src/test/resources/invalid-test/invalid.json"); - Map<String,Object> content = ContentFileParser.parse(file); + Map<String,Object> content = ContentFileParserUtil.parse(file); assertNull(content); } @@ -50,7 +50,7 @@ public class ContentFileParserTest { @Test public void testParseJcrXml() { File file = new File("src/test/resources/fs-test/folder3/content.jcr.xml"); - Map<String,Object> content = ContentFileParser.parse(file); + Map<String,Object> content = ContentFileParserUtil.parse(file); assertNotNull(content); assertEquals("app:Page", content.get("jcr:primaryType")); assertEquals("app:PageContent", ((Map<String,Object>)content.get("jcr:content")).get("jcr:primaryType")); @@ -59,7 +59,7 @@ public class ContentFileParserTest { @Test public void testParseInvalidJcrXml() { File file = new File("src/test/resources/invalid-test/invalid.jcr.xml"); - Map<String,Object> content = ContentFileParser.parse(file); + Map<String,Object> content = ContentFileParserUtil.parse(file); assertNull(content); } diff --git a/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParserTest.java b/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParserTest.java deleted file mode 100644 index 7cccbcf..0000000 --- a/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlFileParserTest.java +++ /dev/null @@ -1,34 +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. - */ -package org.apache.sling.fsprovider.internal.parser; - -import static org.junit.Assert.assertEquals; - -import org.apache.jackrabbit.util.ISO9075; -import org.junit.Test; - -public class JcrXmlFileParserTest { - - @Test - public void testDecodeName() { - assertEquals("jcr:title", JcrXmlFileParser.decodeName("jcr:" + ISO9075.encode("title"))); - assertEquals("sling:123", JcrXmlFileParser.decodeName("sling:" + ISO9075.encode("123"))); - } - -} diff --git a/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverterTest.java b/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverterTest.java deleted file mode 100644 index 15fe989..0000000 --- a/src/test/java/org/apache/sling/fsprovider/internal/parser/JcrXmlValueConverterTest.java +++ /dev/null @@ -1,105 +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. - */ -package org.apache.sling.fsprovider.internal.parser; - -import static org.apache.sling.fsprovider.internal.parser.JcrXmlValueConverter.parseValue; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; - -import java.util.Calendar; - -import org.junit.Test; - -public class JcrXmlValueConverterTest { - - @Test - public void testNull() { - assertNull(parseValue(null)); - } - - @Test(expected = IllegalArgumentException.class) - public void testInvalid() { - parseValue("{InvalidType}xyz"); - } - - @Test - public void testString() { - assertEquals("myString", parseValue("myString")); - assertEquals("prop", "myString [ ] { } \\ ,", parseValue("myString [ ] { } \\\\ ,")); - assertEquals("{myString}", parseValue("\\{myString}")); - assertEquals("aaa{myString}", parseValue("aaa{myString}")); - assertEquals("[myString]", parseValue("\\[myString]")); - assertEquals("aaa[myString]", parseValue("aaa[myString]")); - } - - @Test - public void testStringArray() { - assertArrayEquals(new Object[] { "myString1", "myString2" }, (Object[]) parseValue("[myString1,myString2]")); - assertArrayEquals(new Object[] { "myString1,[]\\äöü߀", "myString2", "myString3 [ ] { } \\ ,", "", "[myString5]", "{myString6}" }, - (Object[]) parseValue("[myString1\\,[]\\\\äöü߀,myString2,myString3 [ ] { } \\\\ \\,,,[myString5],{myString6}]")); - } - - @Test - public void testBoolean() { - assertEquals(true, parseValue("{Boolean}true")); - assertEquals(false, parseValue("{Boolean}false")); - } - - @Test - public void testBooleanArray() { - assertArrayEquals(new Object[] { true, false }, (Object[]) parseValue("{Boolean}[true,false]")); - } - - @Test - public void testLong() { - assertEquals(1L, parseValue("{Long}1")); - assertEquals(10000000000L, parseValue("{Long}10000000000")); - } - - @Test - public void testLongArray() { - assertArrayEquals(new Object[] { 1L, 2L }, (Object[]) parseValue("{Long}[1,2]")); - assertArrayEquals(new Object[] { 10000000000L, 20000000000L }, (Object[]) parseValue("{Long}[10000000000,20000000000]")); - } - - @Test - public void testDouble() { - assertEquals(1.234d, parseValue("{Decimal}1.234")); - } - - @Test - public void testDoubleArray() { - assertArrayEquals(new Object[] { 1.234d, 2.345d }, (Object[]) parseValue("{Decimal}[1.234,2.345]")); - } - - @Test - public void testCalendar() { - Calendar value = (Calendar)parseValue("{Date}2010-09-05T15:10:20.000Z"); - assertEquals(2010, value.get(Calendar.YEAR)); - assertEquals(8, value.get(Calendar.MONTH)); - assertEquals(5, value.get(Calendar.DAY_OF_MONTH)); - } - - @Test - public void testStringArrayRepPrivileges() { - assertArrayEquals(new Object[] { "rep:write", "crx:replicate", "jcr:read" }, (Object[]) parseValue("{Name}[rep:write,crx:replicate,jcr:read]")); - } - -} -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
