You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2016/01/04 14:34:17 UTC
svn commit: r1722866 - in
/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant:
TenantManager.java internal/TenantProviderImpl.java
spi/TenantCustomizer.java spi/TenantManagerHook.java spi/package-info.java
Author: cziegeler
Date: Mon Jan 4 13:34:17 2016
New Revision: 1722866
URL: http://svn.apache.org/viewvc?rev=1722866&view=rev
Log:
SLING-5240 : Remove getAdministrativeResourceResolver() usage from org.apache.sling.tenant
Added:
sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java (with props)
Modified:
sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/TenantManager.java
sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/internal/TenantProviderImpl.java
sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantCustomizer.java
sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/package-info.java
Modified: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/TenantManager.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/TenantManager.java?rev=1722866&r1=1722865&r2=1722866&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/TenantManager.java (original)
+++ sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/TenantManager.java Mon Jan 4 13:34:17 2016
@@ -47,7 +47,7 @@ public interface TenantManager {
* properties.
* <p>
* After creating the tenant, the
- * {@link org.apache.sling.tenant.spi.TenantCustomizer#setup(Tenant, org.apache.sling.api.resource.ResourceResolver)}
+ * {@link org.apache.sling.tenant.spi.TenantManagerHook#setup(Tenant)}
* method is called to allow customizers to configure additional properties.
* <p>
* Before returning the newly created tenant object the data is persisted.
@@ -72,7 +72,7 @@ public interface TenantManager {
* property if the value is {@code null}.
* <p>
* Before returning the
- * {@link org.apache.sling.tenant.spi.TenantCustomizer#setup(Tenant, org.apache.sling.api.resource.ResourceResolver)}
+ * {@link org.apache.sling.tenant.spi.TenantManagerHook#change(Tenant)}
* method is called to allow customizers to configure additional properties.
*
* @param tenant The tenant whose property is to be set or remove.
@@ -88,7 +88,7 @@ public interface TenantManager {
* Sets or removes multiple properties on the tenant.
* <p>
* Before returning the
- * {@link org.apache.sling.tenant.spi.TenantCustomizer#setup(Tenant, org.apache.sling.api.resource.ResourceResolver)}
+ * {@link org.apache.sling.tenant.spi.TenantManagerHook#change(Tenant)}
* method is called to allow customizers to configure additional properties.
*
* @param tenant The tenant whose properties are to be modified.
@@ -103,7 +103,7 @@ public interface TenantManager {
* Removes one or more properties from the tenant.
* <p>
* Before returning the
- * {@link org.apache.sling.tenant.spi.TenantCustomizer#setup(Tenant, org.apache.sling.api.resource.ResourceResolver)}
+ * {@link org.apache.sling.tenant.spi.TenantManagerHook#change(Tenant)}
* method is called to allow customizers to configure additional properties
* unless the {@code properties} parameter is {@code null} or empty.
*
@@ -120,7 +120,7 @@ public interface TenantManager {
* Removes the given tenant.
* <p>
* Before returning the
- * {@link org.apache.sling.tenant.spi.TenantCustomizer#remove(Tenant, org.apache.sling.api.resource.ResourceResolver)}
+ * {@link org.apache.sling.tenant.spi.TenantManagerHook#remove(Tenant)}
* method is called to allow customizers to implement further cleanup upon
* tenant removal.
*
Modified: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/internal/TenantProviderImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/internal/TenantProviderImpl.java?rev=1722866&r1=1722865&r2=1722866&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/internal/TenantProviderImpl.java (original)
+++ sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/internal/TenantProviderImpl.java Mon Jan 4 13:34:17 2016
@@ -32,12 +32,12 @@ import java.util.TreeMap;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;
import org.apache.felix.scr.annotations.PropertyUnbounded;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
+import org.apache.felix.scr.annotations.References;
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.api.resource.LoginException;
import org.apache.sling.api.resource.ModifiableValueMap;
@@ -53,6 +53,7 @@ import org.apache.sling.tenant.TenantMan
import org.apache.sling.tenant.TenantProvider;
import org.apache.sling.tenant.internal.console.WebConsolePlugin;
import org.apache.sling.tenant.spi.TenantCustomizer;
+import org.apache.sling.tenant.spi.TenantManagerHook;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
import org.osgi.framework.Filter;
@@ -69,15 +70,20 @@ import org.slf4j.LoggerFactory;
label = "Apache Sling Tenant Provider",
description = "Service responsible for providing Tenants",
immediate = true)
-@Service
-@Properties(value = {
- @Property(name = Constants.SERVICE_DESCRIPTION, value = "Apache Sling Tenant Provider")
-})
-@Reference(
+@Service(value = {TenantProvider.class, TenantManager.class})
+@Property(name = Constants.SERVICE_DESCRIPTION, value = "Apache Sling Tenant Provider")
+@References({
+ @Reference(
name = "tenantSetup",
referenceInterface = TenantCustomizer.class,
cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
- policy = ReferencePolicy.DYNAMIC)
+ policy = ReferencePolicy.DYNAMIC),
+ @Reference(
+ name = "hook",
+ referenceInterface = TenantManagerHook.class,
+ cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE,
+ policy = ReferencePolicy.DYNAMIC)
+})
public class TenantProviderImpl implements TenantProvider, TenantManager {
/** default log */
@@ -96,6 +102,9 @@ public class TenantProviderImpl implemen
private SortedMap<Comparable<Object>, TenantCustomizer> registeredTenantHandlers = new TreeMap<Comparable<Object>, TenantCustomizer>(
Collections.reverseOrder());
+ private SortedMap<Comparable<Object>, TenantManagerHook> registeredHooks = new TreeMap<Comparable<Object>, TenantManagerHook>(
+ Collections.reverseOrder());
+
@Property(
value = {},
unbounded = PropertyUnbounded.ARRAY,
@@ -146,9 +155,25 @@ public class TenantProviderImpl implemen
return registeredTenantHandlers.values();
}
+ @SuppressWarnings("unused")
+ private synchronized void bindHook(TenantManagerHook action, Map<String, Object> config) {
+ registeredHooks.put(ServiceUtil.getComparableForServiceRanking(config), action);
+ }
+
+ @SuppressWarnings("unused")
+ private synchronized void unbindHook(TenantManagerHook action, Map<String, Object> config) {
+ registeredHooks.remove(ServiceUtil.getComparableForServiceRanking(config));
+ }
+
+ private synchronized Collection<TenantManagerHook> getHooks() {
+ return registeredHooks.values();
+ }
+
+ @Override
public Tenant getTenant(final String tenantId) {
if (tenantId != null && tenantId.length() > 0) {
return call(new ResourceResolverTask<Tenant>() {
+ @Override
public Tenant call(ResourceResolver resolver) {
Resource tenantRes = getTenantResource(resolver, tenantId);
return (tenantRes != null) ? new TenantImpl(tenantRes) : null;
@@ -160,10 +185,12 @@ public class TenantProviderImpl implemen
return null;
}
+ @Override
public Iterator<Tenant> getTenants() {
return getTenants(null);
}
+ @Override
public Iterator<Tenant> getTenants(final String tenantFilter) {
final Filter filter;
if (tenantFilter != null && tenantFilter.length() > 0) {
@@ -177,6 +204,7 @@ public class TenantProviderImpl implemen
}
Iterator<Tenant> result = call(new ResourceResolverTask<Iterator<Tenant>>() {
+ @Override
public Iterator<Tenant> call(ResourceResolver resolver) {
Resource tenantRootRes = resolver.getResource(tenantRootPath);
@@ -202,15 +230,17 @@ public class TenantProviderImpl implemen
return result;
}
+ @Override
public Tenant create(final String tenantId, final Map<String, Object> properties) {
return call(new ResourceResolverTask<Tenant>() {
+ @Override
public Tenant call(ResourceResolver adminResolver) {
try {
// create the tenant
Resource tenantRes = createTenantResource(adminResolver, tenantId, properties);
TenantImpl tenant = new TenantImpl(tenantRes);
adminResolver.commit();
- customizeTenant(tenantRes, tenant);
+ customizeTenant(tenantRes, tenant, true);
adminResolver.commit();
// refresh tenant instance, as it copies property from
@@ -231,8 +261,10 @@ public class TenantProviderImpl implemen
});
}
+ @Override
public void remove(final Tenant tenant) {
call(new ResourceResolverTask<Void>() {
+ @Override
public Void call(ResourceResolver resolver) {
try {
Resource tenantRes = getTenantResource(resolver, tenant.getId());
@@ -245,6 +277,14 @@ public class TenantProviderImpl implemen
log.info("removeTenant: Unexpected problem calling TenantCustomizer " + ts, e);
}
}
+ // call tenant hooks
+ for (TenantManagerHook ts : getHooks()) {
+ try {
+ ts.remove(tenant);
+ } catch (Exception e) {
+ log.info("removeTenant: Unexpected problem calling TenantManagerHook " + ts, e);
+ }
+ }
resolver.delete(tenantRes);
resolver.commit();
@@ -258,8 +298,10 @@ public class TenantProviderImpl implemen
});
}
+ @Override
public void setProperty(final Tenant tenant, final String name, final Object value) {
updateProperties(tenant, new PropertiesUpdater() {
+ @Override
public void update(ModifiableValueMap properties) {
if (value != null) {
properties.put(name, value);
@@ -270,8 +312,10 @@ public class TenantProviderImpl implemen
});
}
+ @Override
public void setProperties(final Tenant tenant, final Map<String, Object> properties) {
updateProperties(tenant, new PropertiesUpdater() {
+ @Override
public void update(ModifiableValueMap vm) {
for (Entry<String, Object> entry : properties.entrySet()) {
if (entry.getValue() != null) {
@@ -284,8 +328,10 @@ public class TenantProviderImpl implemen
});
}
+ @Override
public void removeProperties(final Tenant tenant, final String... propertyNames) {
updateProperties(tenant, new PropertiesUpdater() {
+ @Override
public void update(ModifiableValueMap properties) {
for (String name : propertyNames) {
properties.remove(name);
@@ -334,7 +380,7 @@ public class TenantProviderImpl implemen
return resolver.getResource(tenantRootPath + "/" + tenantId);
}
- private void customizeTenant(final Resource tenantRes, final Tenant tenant) {
+ private void customizeTenant(final Resource tenantRes, final Tenant tenant, boolean isCreate) {
// call tenant setup handler
Map<String, Object> tenantProps = tenantRes.adaptTo(ModifiableValueMap.class);
@@ -355,6 +401,17 @@ public class TenantProviderImpl implemen
log.info("addTenant: Unexpected problem calling TenantCustomizer " + ts, e);
}
}
+ // call tenant hooks
+ for (TenantManagerHook ts : getHooks()) {
+ try {
+ Map<String, Object> props = (isCreate ? ts.setup(tenant) : ts.change(tenant));
+ if (props != null) {
+ tenantProps.putAll(props);
+ }
+ } catch (Exception e) {
+ log.info("removeTenant: Unexpected problem calling TenantManagerHook " + ts, e);
+ }
+ }
}
private <T> T call(ResourceResolverTask<T> task) {
@@ -377,6 +434,7 @@ public class TenantProviderImpl implemen
private void updateProperties(final Tenant tenant, final PropertiesUpdater updater) {
call(new ResourceResolverTask<Void>() {
+ @Override
public Void call(ResourceResolver resolver) {
try {
Resource tenantRes = getTenantResource(resolver, tenant.getId());
@@ -388,7 +446,7 @@ public class TenantProviderImpl implemen
((TenantImpl) tenant).loadProperties(tenantRes);
}
- customizeTenant(tenantRes, tenant);
+ customizeTenant(tenantRes, tenant, false);
resolver.commit();
if (tenant instanceof TenantImpl) {
Modified: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantCustomizer.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantCustomizer.java?rev=1722866&r1=1722865&r2=1722866&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantCustomizer.java (original)
+++ sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantCustomizer.java Mon Jan 4 13:34:17 2016
@@ -30,7 +30,11 @@ import aQute.bnd.annotation.ConsumerType
*
* Tools can hook into the tenant creation, changing a tenant and removing
* thereof by implementing this interface.
+ *
+ * @deprecated This interface will not be supported in future versions. Use
+ * {@link TenantManagerHook} instead.
*/
+@Deprecated
@ConsumerType
public interface TenantCustomizer {
@@ -54,7 +58,7 @@ public interface TenantCustomizer {
* property accessor methods. {@code null} or an empty map may be
* returned to not add properties.
*/
- public Map<String, Object> setup(Tenant tenant, ResourceResolver resolver);
+ Map<String, Object> setup(Tenant tenant, ResourceResolver resolver);
/**
* Called to remove the setup for the given Tenant. This reverts all changes
@@ -72,5 +76,5 @@ public interface TenantCustomizer {
* persistence for further cleanup. Note, that this
* {@code resolver} will have administrative privileges.
*/
- public void remove(Tenant tenant, ResourceResolver resolver);
+ void remove(Tenant tenant, ResourceResolver resolver);
}
Added: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java?rev=1722866&view=auto
==============================================================================
--- sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java (added)
+++ sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java Mon Jan 4 13:34:17 2016
@@ -0,0 +1,78 @@
+/*
+ * 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.tenant.spi;
+
+import java.util.Map;
+
+import org.apache.sling.tenant.Tenant;
+
+import aQute.bnd.annotation.ConsumerType;
+
+/**
+ * This is a service interface to customize tenant setup and administration.
+ *
+ * Tools can hook into the tenant creation, changing a tenant and removing
+ * thereof by implementing this interface.
+ *
+ * @since 1.1
+ */
+@ConsumerType
+public interface TenantManagerHook {
+
+ /**
+ * Method called to create the given tenant. The method may return
+ * additional properties to be added to the Tenant's property list.
+ * <p>
+ * This method is not expected to throw an exception. Any exception thrown
+ * is logged but otherwise ignored.
+ *
+ * @param tenant The {@link Tenant} to be configured by this call
+ * @return Additional properties to be added to the tenant. These properties
+ * may later be accessed through the {@linkplain Tenant tenant's}
+ * property accessor methods. {@code null} or an empty map may be
+ * returned to not add properties.
+ */
+ Map<String, Object> setup(Tenant tenant);
+
+ /**
+ * Method called to update the given tenant. The method may return
+ * additional properties to be added to the Tenant's property list.
+ * <p>
+ * This method is not expected to throw an exception. Any exception thrown
+ * is logged but otherwise ignored.
+ *
+ * @param tenant The {@link Tenant} to be configured by this call
+ * @return Additional properties to be added to the tenant. These properties
+ * may later be accessed through the {@linkplain Tenant tenant's}
+ * property accessor methods. {@code null} or an empty map may be
+ * returned to not add properties.
+ */
+ Map<String, Object> change(Tenant tenant);
+
+ /**
+ * Called to remove the setup for the given Tenant. This reverts all changes
+ * done by the #setup method.
+ * <p>
+ * This method is not expected to throw an exception. Any exception thrown
+ * is logged but otherwise ignored.
+ *
+ * @param tenant The {@link Tenant} about to be removed
+ */
+ void remove(Tenant tenant);
+}
Propchange: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/TenantManagerHook.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Modified: sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/package-info.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/package-info.java?rev=1722866&r1=1722865&r2=1722866&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/package-info.java (original)
+++ sling/trunk/contrib/extensions/tenant/src/main/java/org/apache/sling/tenant/spi/package-info.java Mon Jan 4 13:34:17 2016
@@ -17,7 +17,7 @@
* under the License.
*/
-@Version("1.0")
+@Version("1.1")
package org.apache.sling.tenant.spi;
import aQute.bnd.annotation.Version;