You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by an...@apache.org on 2020/09/22 14:10:57 UTC
svn commit: r1881931 - in
/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark:
./ authorization/
Author: angela
Date: Tue Sep 22 14:10:56 2020
New Revision: 1881931
URL: http://svn.apache.org/viewvc?rev=1881931&view=rev
Log:
OAK-9220 : PermissionProvider.refresh - create benchmarks
Added:
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java (with props)
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java (with props)
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java (with props)
Modified:
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/AbstractHasItemGetItemTest.java
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPermissionHasItemGetItemTest.java
jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPrivilegesHasItemGetItemTest.java
Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java?rev=1881931&r1=1881930&r2=1881931&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/BenchmarkRunner.java Tue Sep 22 14:10:56 2020
@@ -17,17 +17,6 @@
package org.apache.jackrabbit.oak.benchmark;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
-
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.Counting;
import com.codahale.metrics.Metric;
@@ -47,8 +36,11 @@ import org.apache.jackrabbit.oak.benchma
import org.apache.jackrabbit.oak.benchmark.authentication.external.SyncExternalUsersTest;
import org.apache.jackrabbit.oak.benchmark.authorization.AceCreationTest;
import org.apache.jackrabbit.oak.benchmark.authorization.CanReadNonExisting;
+import org.apache.jackrabbit.oak.benchmark.authorization.SaveHasItemGetItemTest;
import org.apache.jackrabbit.oak.benchmark.authorization.HasPermissionHasItemGetItemTest;
import org.apache.jackrabbit.oak.benchmark.authorization.HasPrivilegesHasItemGetItemTest;
+import org.apache.jackrabbit.oak.benchmark.authorization.RefreshHasItemGetItemTest;
+import org.apache.jackrabbit.oak.benchmark.authorization.RefreshHasPrivPermHasItemGetItemTest;
import org.apache.jackrabbit.oak.benchmark.authorization.permission.EagerCacheSizeTest;
import org.apache.jackrabbit.oak.benchmark.authorization.principalbased.HasItemGetItemIsModifiedTest;
import org.apache.jackrabbit.oak.benchmark.authorization.principalbased.PermissionEvaluationTest;
@@ -61,6 +53,17 @@ import org.apache.jackrabbit.oak.fixture
import org.apache.jackrabbit.oak.plugins.metric.MetricStatisticsProvider;
import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+
public class BenchmarkRunner {
private static final int MB = 1024 * 1024;
@@ -267,6 +270,21 @@ public class BenchmarkRunner {
benchmarkOptions.getItemsToRead().value(options),
benchmarkOptions.getNumberOfInitialAce().value(options),
benchmarkOptions.getNumberOfGroups().value(options),
+ benchmarkOptions.getReport().value(options)),
+ new RefreshHasItemGetItemTest(
+ benchmarkOptions.getItemsToRead().value(options),
+ benchmarkOptions.getNumberOfInitialAce().value(options),
+ benchmarkOptions.getNumberOfGroups().value(options),
+ benchmarkOptions.getReport().value(options)),
+ new RefreshHasPrivPermHasItemGetItemTest(
+ benchmarkOptions.getItemsToRead().value(options),
+ benchmarkOptions.getNumberOfInitialAce().value(options),
+ benchmarkOptions.getNumberOfGroups().value(options),
+ benchmarkOptions.getReport().value(options)),
+ new SaveHasItemGetItemTest(
+ benchmarkOptions.getItemsToRead().value(options),
+ benchmarkOptions.getNumberOfInitialAce().value(options),
+ benchmarkOptions.getNumberOfGroups().value(options),
benchmarkOptions.getReport().value(options)),
new ConcurrentReadDeepTreeTest(
benchmarkOptions.getRunAsAdmin().value(options),
Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/AbstractHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/AbstractHasItemGetItemTest.java?rev=1881931&r1=1881930&r2=1881931&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/AbstractHasItemGetItemTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/AbstractHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -16,6 +16,7 @@
*/
package org.apache.jackrabbit.oak.benchmark.authorization;
+import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager;
@@ -25,6 +26,7 @@ import org.apache.jackrabbit.api.securit
import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils;
import org.apache.jackrabbit.oak.benchmark.ReadDeepTreeTest;
import org.apache.jackrabbit.oak.commons.PathUtils;
+import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
import org.jetbrains.annotations.NotNull;
import javax.jcr.Item;
@@ -35,6 +37,7 @@ import javax.jcr.security.Privilege;
import javax.security.auth.Subject;
import java.security.Principal;
import java.util.List;
+import java.util.Set;
import static javax.jcr.security.Privilege.JCR_ALL;
@@ -46,6 +49,7 @@ abstract class AbstractHasItemGetItemTes
private Subject subject;
List<Privilege> allPrivileges;
+ private Set<String> nodeSet;
AbstractHasItemGetItemTest(int itemsToRead, int numberOfACEs, int numberOfGroups, boolean doReport) {
super(false, itemsToRead, doReport, false);
@@ -82,6 +86,7 @@ abstract class AbstractHasItemGetItemTes
createForEachPrincipal(principal, acMgr, allPrivileges);
adminSession.save();
+ nodeSet = ImmutableSet.copyOf(nodePaths);
}
private void createForEachPrincipal(@NotNull Principal pGrantedRead, @NotNull JackrabbitAccessControlManager acMgr, @NotNull List<Privilege> allPrivileges) throws RepositoryException {
@@ -128,7 +133,7 @@ abstract class AbstractHasItemGetItemTes
String path = allPaths.get(index);
if (i % 100 == 0) {
addCnt++;
- additionalRead(path, testSession, acMgr);
+ additionalOperations(path, testSession, acMgr);
}
if (testSession.itemExists(path)) {
Item item = testSession.getItem(path);
@@ -152,9 +157,24 @@ abstract class AbstractHasItemGetItemTes
}
}
+ @NotNull
abstract String additionalMethodName();
- abstract void additionalRead(String path, Session s, AccessControlManager acMgr);
+ abstract void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr);
+
+ @NotNull
+ String getAccessControlledPath(@NotNull String path) {
+ String np = path;
+ if (!nodeSet.contains(path)) {
+ int ind = path.indexOf(AccessControlConstants.REP_POLICY);
+ if (ind == -1) {
+ np = PathUtils.getParentPath(path);
+ } else {
+ np = path.substring(0, ind);
+ }
+ }
+ return np;
+ }
@NotNull
@Override
Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPermissionHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPermissionHasItemGetItemTest.java?rev=1881931&r1=1881930&r2=1881931&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPermissionHasItemGetItemTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPermissionHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -34,13 +34,14 @@ public class HasPermissionHasItemGetItem
super(itemsToRead, numberOfACEs, numberOfGroups, doReport);
}
+ @NotNull
@Override
String additionalMethodName() {
return "hasPermission";
}
@Override
- void additionalRead(String path, Session s, AccessControlManager acMgr) {
+ void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr) {
try {
String actions = Text.implode((String[]) Utils.getRandom(PERMISSIONS, 3).toArray(new String[0]), ",");
s.hasPermission(path, actions);
Modified: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPrivilegesHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPrivilegesHasItemGetItemTest.java?rev=1881931&r1=1881930&r2=1881931&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPrivilegesHasItemGetItemTest.java (original)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/HasPrivilegesHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -16,49 +16,29 @@
*/
package org.apache.jackrabbit.oak.benchmark.authorization;
-import com.google.common.collect.ImmutableSet;
-import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.spi.security.authorization.accesscontrol.AccessControlConstants;
import org.jetbrains.annotations.NotNull;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.jcr.security.AccessControlManager;
import javax.jcr.security.Privilege;
-import java.util.Set;
public class HasPrivilegesHasItemGetItemTest extends AbstractHasItemGetItemTest {
- private Set<String> nodeSet;
-
public HasPrivilegesHasItemGetItemTest(int itemsToRead, int numberOfACEs, int numberOfGroups, boolean doReport) {
super(itemsToRead, numberOfACEs, numberOfGroups, doReport);
}
- @Override
- protected void beforeSuite() throws Exception {
- super.beforeSuite();
- nodeSet = ImmutableSet.copyOf(nodePaths);
- }
-
+ @NotNull
@Override
String additionalMethodName() {
return "hasPrivileges";
}
@Override
- void additionalRead(String path, Session s, AccessControlManager acMgr) {
- String np = path;
- if (!nodeSet.contains(path)) {
- int ind = path.indexOf(AccessControlConstants.REP_POLICY);
- if (ind == -1) {
- np = PathUtils.getParentPath(path);
- } else {
- np = path.substring(0, ind);
- }
- }
+ void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr) {
try {
- acMgr.hasPrivileges(np, (Privilege[]) Utils.getRandom(allPrivileges, 3).toArray(new Privilege[0]));
+ acMgr.hasPrivileges(getAccessControlledPath(path), (Privilege[]) Utils.getRandom(allPrivileges, 3).toArray(new Privilege[0]));
} catch (RepositoryException e) {
if (doReport) {
e.printStackTrace(System.out);
Added: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java?rev=1881931&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java (added)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -0,0 +1,56 @@
+/*
+ * 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.jackrabbit.oak.benchmark.authorization;
+
+import org.jetbrains.annotations.NotNull;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.security.AccessControlManager;
+import java.util.Random;
+
+public class RefreshHasItemGetItemTest extends AbstractHasItemGetItemTest {
+
+ private final Random r = new Random();
+
+ public RefreshHasItemGetItemTest(int itemsToRead, int numberOfACEs, int numberOfGroups, boolean doReport) {
+ super(itemsToRead, numberOfACEs, numberOfGroups, doReport);
+ }
+
+ @NotNull
+ @Override
+ String additionalMethodName() {
+ return "refresh";
+ }
+
+ @Override
+ void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr) {
+ try {
+ s.refresh(r.nextBoolean());
+ } catch (RepositoryException e) {
+ if (doReport) {
+ e.printStackTrace(System.out);
+ }
+ }
+ }
+
+ @NotNull
+ @Override
+ protected String getTestNodeName() {
+ return "RefreshHasItemGetItemTest";
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasItemGetItemTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java?rev=1881931&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java (added)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -0,0 +1,72 @@
+/*
+ * 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.jackrabbit.oak.benchmark.authorization;
+
+import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants;
+import org.jetbrains.annotations.NotNull;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.security.AccessControlManager;
+import javax.jcr.security.Privilege;
+import java.util.Random;
+
+public class RefreshHasPrivPermHasItemGetItemTest extends AbstractHasItemGetItemTest {
+
+ private final Random r = new Random();
+ private Privilege[] privs;
+
+ public RefreshHasPrivPermHasItemGetItemTest(int itemsToRead, int numberOfACEs, int numberOfGroups, boolean doReport) {
+ super(itemsToRead, numberOfACEs, numberOfGroups, doReport);
+ }
+
+ @Override
+ protected void beforeSuite() throws Exception {
+ super.beforeSuite();
+
+ privs = new Privilege[] {adminSession.getAccessControlManager().privilegeFromName(PrivilegeConstants.JCR_MODIFY_PROPERTIES)};
+
+ }
+
+ @NotNull
+ @Override
+ String additionalMethodName() {
+ return "hasPermission|hasPrivileges + refresh";
+ }
+
+ @Override
+ void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr) {
+ try {
+ if (r.nextBoolean()) {
+ s.hasPermission(path, Session.ACTION_SET_PROPERTY);
+ } else {
+ acMgr.hasPrivileges(getAccessControlledPath(path), privs);
+ }
+ s.refresh(r.nextBoolean());
+ } catch (RepositoryException e) {
+ if (doReport) {
+ e.printStackTrace(System.out);
+ }
+ }
+ }
+
+ @NotNull
+ @Override
+ protected String getTestNodeName() {
+ return "RefreshHasPrivPermHasItemGetItemTest";
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/RefreshHasPrivPermHasItemGetItemTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java?rev=1881931&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java (added)
+++ jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java Tue Sep 22 14:10:56 2020
@@ -0,0 +1,62 @@
+/*
+ * 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.jackrabbit.oak.benchmark.authorization;
+
+import org.jetbrains.annotations.NotNull;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.security.AccessControlManager;
+
+/**
+ * Test effect of PermissionProvider.refresh called upon Session.save(). In contrast to {@link RefreshHasItemGetItemTest}
+ * a separate Session is created for the save operation to reflect the scenario where the session is logged-out after
+ * saving changes.
+ */
+public class SaveHasItemGetItemTest extends AbstractHasItemGetItemTest {
+
+ private static final Logger log = LoggerFactory.getLogger(SaveHasItemGetItemTest.class);
+
+ public SaveHasItemGetItemTest(int itemsToRead, int numberOfACEs, int numberOfGroups, boolean doReport) {
+ super(itemsToRead, numberOfACEs, numberOfGroups, doReport);
+ }
+
+ @NotNull
+ @Override
+ String additionalMethodName() {
+ return "save";
+ }
+
+ @Override
+ void additionalOperations(@NotNull String path, @NotNull Session s, @NotNull AccessControlManager acMgr) {
+ Session otherS = null;
+ try {
+ otherS = getTestSession();
+ otherS.save();
+ } catch (RepositoryException e) {
+ if (doReport) {
+ e.printStackTrace(System.out);
+ }
+ } finally {
+ if (otherS != null && otherS.isLive()) {
+ otherS.logout();
+ }
+ }
+ }
+}
\ No newline at end of file
Propchange: jackrabbit/oak/trunk/oak-benchmarks/src/main/java/org/apache/jackrabbit/oak/benchmark/authorization/SaveHasItemGetItemTest.java
------------------------------------------------------------------------------
svn:eol-style = native