diff options
Diffstat (limited to 'providers/bundles/org.eclipse.ecf.provider.r_osgi')
5 files changed, 132 insertions, 15 deletions
diff --git a/providers/bundles/org.eclipse.ecf.provider.r_osgi/.classpath b/providers/bundles/org.eclipse.ecf.provider.r_osgi/.classpath index 6f3b481ac..64c5e31b7 100644 --- a/providers/bundles/org.eclipse.ecf.provider.r_osgi/.classpath +++ b/providers/bundles/org.eclipse.ecf.provider.r_osgi/.classpath @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/CDC-1.1%Foundation-1.1"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> <classpathentry kind="output" path="bin"/> diff --git a/providers/bundles/org.eclipse.ecf.provider.r_osgi/.settings/org.eclipse.jdt.core.prefs b/providers/bundles/org.eclipse.ecf.provider.r_osgi/.settings/org.eclipse.jdt.core.prefs index e6127aa4b..d6d45f117 100644 --- a/providers/bundles/org.eclipse.ecf.provider.r_osgi/.settings/org.eclipse.jdt.core.prefs +++ b/providers/bundles/org.eclipse.ecf.provider.r_osgi/.settings/org.eclipse.jdt.core.prefs @@ -1,4 +1,3 @@ -#Fri Oct 15 17:09:07 PDT 2010 eclipse.preferences.version=1 org.eclipse.jdt.core.builder.cleanOutputFolder=clean org.eclipse.jdt.core.builder.duplicateResourceTask=warning @@ -7,10 +6,19 @@ org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch org.eclipse.jdt.core.circularClasspath=error org.eclipse.jdt.core.classpath.exclusionPatterns=enabled org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2 +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.compliance=1.5 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -27,6 +35,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod= org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore org.eclipse.jdt.core.compiler.problem.emptyStatement=warning org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled org.eclipse.jdt.core.compiler.problem.fieldHiding=warning @@ -34,6 +43,7 @@ org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.jdt.core.compiler.problem.forbiddenReference=error org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning @@ -41,7 +51,9 @@ org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=enabled @@ -50,25 +62,41 @@ org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning -org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning @@ -78,17 +106,20 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedImport=error org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=enabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=enabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.3 +org.eclipse.jdt.core.compiler.source=1.5 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 diff --git a/providers/bundles/org.eclipse.ecf.provider.r_osgi/META-INF/MANIFEST.MF b/providers/bundles/org.eclipse.ecf.provider.r_osgi/META-INF/MANIFEST.MF index 986c7d10a..c4efb202b 100644 --- a/providers/bundles/org.eclipse.ecf.provider.r_osgi/META-INF/MANIFEST.MF +++ b/providers/bundles/org.eclipse.ecf.provider.r_osgi/META-INF/MANIFEST.MF @@ -2,11 +2,12 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %plugin.name Bundle-SymbolicName: org.eclipse.ecf.provider.r_osgi;singleton:=true -Bundle-Version: 3.5.400.qualifier +Bundle-Version: 3.5.500.qualifier Import-Package: org.eclipse.ecf.core.util.reflection, org.eclipse.ecf.remoteservice.asyncproxy;version="1.0.0", org.eclipse.equinox.concurrent.future;version="1.0.0", org.osgi.framework;version="1.3.0", + org.osgi.framework.wiring, org.osgi.util.tracker;version="1.3.3" Require-Bundle: org.eclipse.ecf;bundle-version="3.1.0", org.eclipse.ecf.provider, @@ -17,8 +18,7 @@ Bundle-Activator: org.eclipse.ecf.internal.provider.r_osgi.Activator Eclipse-LazyStart: true Export-Package: org.eclipse.ecf.provider.r_osgi.identity;version="3.2.0" Bundle-Vendor: %plugin.provider -Bundle-RequiredExecutionEnvironment: CDC-1.1/Foundation-1.1, - J2SE-1.3 +Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ActivationPolicy: lazy Bundle-Localization: plugin DynamicImport-Package: * diff --git a/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/R_OSGiRemoteServiceContainer.java b/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/R_OSGiRemoteServiceContainer.java index e20a2427a..4ff69d358 100644 --- a/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/R_OSGiRemoteServiceContainer.java +++ b/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/R_OSGiRemoteServiceContainer.java @@ -13,6 +13,8 @@ package org.eclipse.ecf.internal.provider.r_osgi; import ch.ethz.iks.r_osgi.*; import java.io.IOException; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.*; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IProgressMonitor; @@ -27,6 +29,8 @@ import org.eclipse.ecf.remoteservice.events.IRemoteServiceUnregisteredEvent; import org.eclipse.equinox.concurrent.future.*; import org.osgi.framework.*; import org.osgi.framework.Constants; +import org.osgi.framework.wiring.BundleCapability; +import org.osgi.framework.wiring.BundleRevision; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; @@ -267,9 +271,11 @@ class R_OSGiRemoteServiceContainer implements IOSGiRemoteServiceContainerAdapter if (clazz == null) { results.add(createLocalRemoteServiceReference(ref)); } else { - IRemoteFilter rf = createRemoteFilter(filter != null ? "(&" + filter + "(" //$NON-NLS-1$ //$NON-NLS-2$ - + Constants.OBJECTCLASS + "=" + clazz + "))" : "(" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - + Constants.OBJECTCLASS + "=" + clazz + ")"); //$NON-NLS-1$//$NON-NLS-2$ + IRemoteFilter rf = createRemoteFilter(filter != null + ? "(&" + filter + "(" //$NON-NLS-1$ //$NON-NLS-2$ + + Constants.OBJECTCLASS + "=" + clazz + "))" //$NON-NLS-1$//$NON-NLS-2$ + : "(" //$NON-NLS-1$ + + Constants.OBJECTCLASS + "=" + clazz + ")"); //$NON-NLS-1$//$NON-NLS-2$ if (rf.match(refProperties)) { results.add(createLocalRemoteServiceReference(ref)); } @@ -372,6 +378,65 @@ class R_OSGiRemoteServiceContainer implements IOSGiRemoteServiceContainerAdapter return registerRemoteService(clazzes, service, properties, bundleContext); } + private String getPackageName(String className) { + int lastDotIndex = className.lastIndexOf("."); //$NON-NLS-1$ + if (lastDotIndex == -1) + return ""; //$NON-NLS-1$ + return className.substring(0, lastDotIndex); + } + + private Version getPackageVersion(final Object service, String serviceInterface, String packageName) { + List<Class> interfaces = new ArrayList<Class>(); + Class<?> serviceClass = service.getClass(); + while (!serviceClass.equals(Object.class)) { + interfaces.addAll(Arrays.asList(serviceClass.getInterfaces())); + serviceClass = serviceClass.getSuperclass(); + } + Class[] interfaceClasses = interfaces.toArray(new Class[interfaces.size()]); + + if (interfaceClasses == null) + return null; + Class interfaceClass = null; + for (int i = 0; i < interfaceClasses.length; i++) + if (interfaceClasses[i].getName().equals(serviceInterface)) + interfaceClass = interfaceClasses[i]; + if (interfaceClass == null) + return null; + Bundle providingBundle = FrameworkUtil.getBundle(interfaceClass); + if (providingBundle == null) + return null; + return getVersionForPackage(providingBundle, packageName); + } + + private Version getVersionForMatchingCapability(String packageName, BundleCapability capability) { + // If it's a package namespace (Import-Package) + Map<String, Object> attributes = capability.getAttributes(); + // Then we get the package attribute + String p = (String) attributes.get(BundleRevision.PACKAGE_NAMESPACE); + // And compare it to the package name + if (p != null && packageName.equals(p)) + return (Version) attributes.get(Constants.VERSION_ATTRIBUTE); + return null; + } + + private Version getVersionForPackage(final Bundle providingBundle, String packageName) { + Version result = null; + BundleRevision providingBundleRevision = AccessController.doPrivileged(new PrivilegedAction<BundleRevision>() { + public BundleRevision run() { + return providingBundle.adapt(BundleRevision.class); + } + }); + if (providingBundleRevision == null) + return null; + List<BundleCapability> providerCapabilities = providingBundleRevision.getDeclaredCapabilities(BundleRevision.PACKAGE_NAMESPACE); + for (BundleCapability c : providerCapabilities) { + result = getVersionForMatchingCapability(packageName, c); + if (result != null) + return result; + } + return result; + } + private IRemoteServiceRegistration registerRemoteService(final String[] clazzes, final Object service, final Dictionary properties, final BundleContext aContext) { if (containerID == null) { throw new IllegalStateException("Container is not connected"); //$NON-NLS-1$ @@ -395,6 +460,16 @@ class R_OSGiRemoteServiceContainer implements IOSGiRemoteServiceContainerAdapter serviceRanking = (serviceRanking == null) ? new Integer(0) : serviceRanking; props.put(org.eclipse.ecf.remoteservice.Constants.SERVICE_RANKING, serviceRanking); + for (String clazz : clazzes) { + // Add osgi-standard remote service version for each package + String packageName = getPackageName(clazz); + String packageVersionKey = "endpoint.package.version." + packageName; //$NON-NLS-1$ + Version packageVersion = getPackageVersion(service, clazz, packageName); + if (packageVersion != null) { + props.put(packageVersionKey, packageVersion.toString()); + } + } + final ServiceRegistration reg = aContext.registerService(clazzes, service, props); // Set ECF remote service id property based upon local service property reg.setProperties(prepareProperties(reg.getReference())); @@ -403,7 +478,7 @@ class R_OSGiRemoteServiceContainer implements IOSGiRemoteServiceContainerAdapter remoteServicesRegs.put(reg.getReference(), reg); } // Construct a IRemoteServiceID, and provide to new registration impl instance - return new RemoteServiceRegistrationImpl(createRemoteServiceID(containerID, (Long) reg.getReference().getProperty(Constants.SERVICE_ID)), reg); + return new RemoteServiceRegistrationImpl(this, createRemoteServiceID(containerID, (Long) reg.getReference().getProperty(Constants.SERVICE_ID)), reg); } Dictionary prepareProperties(ServiceReference reference) { @@ -794,4 +869,10 @@ class R_OSGiRemoteServiceContainer implements IOSGiRemoteServiceContainerAdapter return false; } + void removeRegistration(ServiceRegistration reg) { + synchronized (remoteServicesRegs) { + remoteServicesRegs.remove(reg.getReference()); + } + } + } diff --git a/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/RemoteServiceRegistrationImpl.java b/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/RemoteServiceRegistrationImpl.java index 26a63d262..640bd76a0 100644 --- a/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/RemoteServiceRegistrationImpl.java +++ b/providers/bundles/org.eclipse.ecf.provider.r_osgi/src/org/eclipse/ecf/internal/provider/r_osgi/RemoteServiceRegistrationImpl.java @@ -29,6 +29,8 @@ final class RemoteServiceRegistrationImpl implements IRemoteServiceRegistration private ServiceRegistration reg; private IRemoteServiceReference remoteReference; + private R_OSGiRemoteServiceContainer container; + /** * constructor. * @@ -37,9 +39,11 @@ final class RemoteServiceRegistrationImpl implements IRemoteServiceRegistration * @param reg * the R-OSGi internal service registration. */ - public RemoteServiceRegistrationImpl(final IRemoteServiceID remoteServiceID, final ServiceRegistration reg) { + public RemoteServiceRegistrationImpl(final R_OSGiRemoteServiceContainer container, final IRemoteServiceID remoteServiceID, final ServiceRegistration reg) { Assert.isNotNull(remoteServiceID); Assert.isNotNull(reg); + Assert.isNotNull(container); + this.container = container; this.remoteServiceID = remoteServiceID; this.reg = reg; this.remoteReference = new LocalRemoteServiceReferenceImpl(remoteServiceID, reg.getReference()); @@ -105,6 +109,7 @@ final class RemoteServiceRegistrationImpl implements IRemoteServiceRegistration * @see org.eclipse.ecf.remoteservice.IRemoteServiceRegistration#unregister() */ public void unregister() { + container.removeRegistration(reg); try { reg.unregister(); } catch (IllegalStateException e) { |