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 2010/04/09 16:02:31 UTC
svn commit: r932420 - in
/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl:
InternalScriptHelper.java ServiceCache.java
Author: cziegeler
Date: Fri Apr 9 14:02:31 2010
New Revision: 932420
URL: http://svn.apache.org/viewvc?rev=932420&view=rev
Log:
SLING-1478 : Improve SlingScriptHelper service handling
Added:
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java (with props)
sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java (with props)
Added: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java?rev=932420&view=auto
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java (added)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java Fri Apr 9 14:02:31 2010
@@ -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.sling.scripting.core.impl;
+
+import org.apache.sling.api.SlingHttpServletRequest;
+import org.apache.sling.api.SlingHttpServletResponse;
+import org.apache.sling.api.scripting.SlingScript;
+import org.apache.sling.scripting.core.ScriptHelper;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Internal script helper
+ */
+public class InternalScriptHelper extends ScriptHelper {
+
+ private final ServiceCache serviceCache;
+
+ public InternalScriptHelper(final BundleContext ctx,
+ final SlingScript script,
+ final SlingHttpServletRequest request,
+ final SlingHttpServletResponse response,
+ final ServiceCache cache) {
+ super(ctx, script, request, response);
+ this.serviceCache = cache;
+ }
+
+ public InternalScriptHelper(final BundleContext ctx,
+ final SlingScript script,
+ final ServiceCache cache) {
+ super(ctx, script);
+ this.serviceCache = cache;
+ }
+
+ /**
+ * @see org.apache.sling.api.scripting.SlingScriptHelper#getService(java.lang.Class)
+ */
+ public <ServiceType> ServiceType getService(Class<ServiceType> type) {
+ return this.serviceCache.getService(type);
+ }
+}
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/InternalScriptHelper.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java?rev=932420&view=auto
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java (added)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java Fri Apr 9 14:02:31 2010
@@ -0,0 +1,121 @@
+/*
+ * 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.scripting.core.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+
+public class ServiceCache implements ServiceListener {
+
+ private final BundleContext bundleContext;
+
+ private static final Reference NULL_REFERENCE = new Reference();
+
+ private final ConcurrentHashMap<String, Reference> cache = new ConcurrentHashMap<String, Reference>();
+
+ /**
+ * The list of references - we don't need to synchronize this as we are
+ * running in one single request.
+ */
+ protected final List<ServiceReference> references = new ArrayList<ServiceReference>();
+
+ public ServiceCache(final BundleContext ctx) {
+ this.bundleContext = ctx;
+ this.bundleContext.addServiceListener(this);
+ }
+
+ public void dispose() {
+ this.bundleContext.removeServiceListener(this);
+ for(final Reference ref : cache.values()) {
+ if ( ref != NULL_REFERENCE ) {
+ this.bundleContext.ungetService(ref.reference);
+ }
+ }
+ }
+
+ /**
+ * Return a service for the given service class.
+ * @param <ServiceType> The service class / interface
+ * @param type The requested service
+ * @return The service or <code>null</code>
+ */
+ @SuppressWarnings("unchecked")
+ public <ServiceType> ServiceType getService(Class<ServiceType> type) {
+ final String key = type.getName();
+ Reference reference = this.cache.get(key);
+ if (reference == null ) {
+ // if the service is not in the cache, we have to go into a synchronized
+ // block to avoid concurrent gets of the same service
+ synchronized (this) {
+ reference = this.cache.get(key);
+ if ( reference == null ) {
+ // try to get service from bundle context
+ final ServiceReference ref = this.bundleContext.getServiceReference(key);
+ if (ref != null) {
+ final Object service = this.bundleContext.getService(ref);
+ if ( service != null ) {
+ reference = new Reference();
+ reference.service = service;
+ reference.reference = ref;
+ }
+ }
+ if ( reference == null ) {
+ reference = NULL_REFERENCE;
+ }
+ this.cache.put(key, reference);
+ }
+ }
+
+ }
+ if ( reference == NULL_REFERENCE ) {
+ return null;
+ }
+ return (ServiceType) reference.service;
+ }
+
+ /**
+ * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
+ */
+ public void serviceChanged(ServiceEvent event) {
+ final String[] objectClasses = (String[])event.getServiceReference().getProperty(Constants.OBJECTCLASS);
+ if ( objectClasses != null) {
+ for(final String key : objectClasses) {
+ Reference ref = null;
+ synchronized ( this ) {
+ ref = this.cache.remove(key);
+ }
+ if ( ref != null && ref != NULL_REFERENCE ) {
+ this.bundleContext.ungetService(ref.reference);
+ }
+ }
+ }
+ }
+
+ protected static final class Reference {
+ public ServiceReference reference;
+ public Object service;
+ }
+}
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
------------------------------------------------------------------------------
svn:keywords = author date id revision rev url
Propchange: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/ServiceCache.java
------------------------------------------------------------------------------
svn:mime-type = text/plain