Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bug 552722 design Registry for lic.api RequirementResolvers #185

Merged
merged 2 commits into from
Apr 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.api;

import java.util.Set;
import java.util.stream.Collectors;

import org.eclipse.passage.lic.internal.api.requirements.Requirement;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements;

/**
* Top-level access cycle management is to be implemented here. Just started
* with what we have for now: requirements resolution.
*/
public final class Access {

private final Framework framework;

public Access(Framework framework) {
this.framework = framework;
}

public boolean canUse(String feature) {
Set<Requirement> requirements = framework.requirementsRegistry().get().services().stream() //
.map(ResolvedRequirements.Smart::new) //
.flatMap(service -> service.forFeature(feature).stream()) //
.collect(Collectors.toSet());
if (requirements.isEmpty()) {
return true;
}
// FIXME: EP: implement further
return false;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,7 @@
*******************************************************************************/
package org.eclipse.passage.lic.internal.api;

import java.util.function.Supplier;

import org.eclipse.passage.lic.internal.api.registry.Registry;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirementsRegistry;

/**
* <p>
Expand All @@ -40,6 +36,6 @@
*/
public interface Framework {

Supplier<Registry<StringServiceId, ResolvedRequirements>> requirementsSupplierRegistry();
ResolvedRequirementsRegistry requirementsRegistry();

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
*******************************************************************************/
package org.eclipse.passage.lic.internal.api;

import org.eclipse.passage.lic.api.requirements.LicensingRequirement;
import org.eclipse.passage.lic.api.restrictions.RestrictionExecutor;
import org.eclipse.passage.lic.api.restrictions.RestrictionVerdict;
import org.eclipse.passage.lic.internal.api.requirements.Requirement;

/**
* <p>
Expand All @@ -40,10 +40,10 @@ public interface Passage {
* without proper license.
* </p>
*
* @param featureId string identifier of the feature under licensing.
* @param feature string identifier of the feature under licensing.
* @see org.eclipse.passage.lic.api
*/
void checkLicense(String featureId);
void checkLicense(String feature);

/**
* FIXME: add `see` to dedicated parts of the new version of AccessManager
Expand All @@ -58,16 +58,16 @@ public interface Passage {
* control flow. FIXME: samples
* </p>
*
* @param featureId string identifier of the feature under licensing.
* @param feature string identifier of the feature under licensing.
* @return true if license check found all licensing requirements satisfied and
* found no restrictions. Any restrictions discovered starting from
* {@code warning} up to {@code fatal} causes {@code false} to be
* returned here. FIXME explain where to get these codes.
*
* @see LicensingRequirement
* @see Requirement
* @see RestrictionVerdict
* @see org.eclipse.passage.lic.api
*/
boolean canUse(String featureId);
boolean canUse(String feature);

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,20 +10,13 @@
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.equinox;
package org.eclipse.passage.lic.internal.api.requirements;

import java.util.function.Supplier;

import org.eclipse.passage.lic.internal.api.registry.Registry;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements;

@SuppressWarnings("restriction")
public final class RequirementsSupplierRegistry implements Supplier<Registry<StringServiceId, ResolvedRequirements>> {

@Override
public Registry<StringServiceId, ResolvedRequirements> get() {
throw new UnsupportedOperationException();
}
public interface ResolvedRequirementsRegistry extends Supplier<Registry<StringServiceId, ResolvedRequirements>> {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.passage.lic.internal.equinox.EquinoxFramework">
<service>
<provide interface="org.eclipse.passage.lic.internal.api.Framework"/>
</service>
<reference bind="bind" interface="org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirementsRegistry" unbind="unbind"/>
<implementation class="org.eclipse.passage.lic.internal.equinox.EquinoxFramework"/>
</scr:component>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.passage.lic.internal.equinox.EquinoxResolvedRequirementsRegistry">
<service>
<provide interface="org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirementsRegistry"/>
</service>
<reference bind="add" cardinality="0..n" interface="org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements" unbind="remove"/>
<implementation class="org.eclipse.passage.lic.internal.equinox.EquinoxResolvedRequirementsRegistry"/>
</scr:component>
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@

public class EquinoxRequirements {

/**
* @deprecated not used
*/
@Deprecated
public static Iterable<BundleRequirement> extractLicensingManagementRequirements(Bundle bundle) {
BundleWiring wiring = bundle.adapt(BundleWiring.class);
if (wiring != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,31 @@
*******************************************************************************/
package org.eclipse.passage.lic.internal.equinox;

import java.util.function.Supplier;

import org.eclipse.passage.lic.internal.api.Framework;
import org.eclipse.passage.lic.internal.api.registry.Registry;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirementsRegistry;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@SuppressWarnings("restriction")
@Component
public final class EquinoxFramework implements Framework {

private ResolvedRequirementsRegistry requirements;

@Override
public Supplier<Registry<StringServiceId, ResolvedRequirements>> requirementsSupplierRegistry() {
throw new UnsupportedOperationException();
public ResolvedRequirementsRegistry requirementsRegistry() {
return requirements;
}

@Reference
public void bind(ResolvedRequirementsRegistry registry) {
this.requirements = registry;
}

public void unbind(ResolvedRequirementsRegistry registry) {
if (this.requirements.equals(registry)) {
this.requirements = null;
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,26 @@
*******************************************************************************/
package org.eclipse.passage.lic.internal.equinox;

import java.util.Optional;

import org.eclipse.passage.lic.internal.api.Access;
import org.eclipse.passage.lic.internal.api.Framework;
import org.eclipse.passage.lic.internal.api.Passage;

@SuppressWarnings("restriction")
public final class EquinoxPassage implements Passage {

@Override
public boolean canUse(String featureId) {
throw new UnsupportedOperationException();
public boolean canUse(String feature) {
Optional<Framework> framework = new FrameworkSupplier().get();
if (!framework.isPresent()) {
return false;
}
return new Access(framework.get()).canUse(feature);
}

@Override
public void checkLicense(String featureId) {
public void checkLicense(String feature) {
// accessManager.executeAccessRestrictions(configuration);
throw new UnsupportedOperationException();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.equinox;

import org.eclipse.passage.lic.internal.api.registry.Registry;
import org.eclipse.passage.lic.internal.api.registry.RuntimeRegistry;
import org.eclipse.passage.lic.internal.api.registry.StringServiceId;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirements;
import org.eclipse.passage.lic.internal.api.requirements.ResolvedRequirementsRegistry;
import org.eclipse.passage.lic.internal.base.registry.BaseRuntimeRegistry;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;

@SuppressWarnings("restriction")

@Component
public final class EquinoxResolvedRequirementsRegistry implements ResolvedRequirementsRegistry {

private final RuntimeRegistry<StringServiceId, ResolvedRequirements> registry = //
new BaseRuntimeRegistry<StringServiceId, ResolvedRequirements>();

@Override
public Registry<StringServiceId, ResolvedRequirements> get() {
return registry;
}

@Reference(cardinality = ReferenceCardinality.MULTIPLE)
public void add(ResolvedRequirements service) {
registry.register(service);
}

public void remove(ResolvedRequirements service) {
registry.unregister(service);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*******************************************************************************
* Copyright (c) 2020 ArSysOp
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0/.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* ArSysOp - initial API and implementation
*******************************************************************************/
package org.eclipse.passage.lic.internal.equinox;

import java.util.Optional;
import java.util.function.Supplier;

import org.eclipse.passage.lic.internal.api.Framework;
import org.eclipse.passage.lic.internal.equinox.i18n.EquinoxMessages;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings("restriction")
final class FrameworkSupplier implements Supplier<Optional<Framework>> {

private final Logger log = LoggerFactory.getLogger(getClass());

@Override
public Optional<Framework> get() {
BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
try {
return context.getServiceReferences(Framework.class, null).stream() //
.map(context::getService) //
.filter(s -> s.getClass() == EquinoxFramework.class) //
.findAny();
} catch (InvalidSyntaxException e) {
log.error(EquinoxMessages.EquinoxPassage_no_framework, e);
return Optional.empty();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ public class EquinoxMessages extends NLS {
private static final String BUNDLE_NAME = "org.eclipse.passage.lic.internal.equinox.i18n.EquinoxMessages"; //$NON-NLS-1$

public static String ApplicationConfigurations_contact_defaults;
public static String EquinoxPassage_no_framework;

public static String EquinoxPaths_uri_retrieval_error;
public static String EquinoxRestrictions_feature_is_licensed;
public static String EquinoxRestrictions_feature_is_not_licensed;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
###############################################################################

ApplicationConfigurations_contact_defaults=Eclipse Passage \nhttps://www.eclipse.org/passage
EquinoxPassage_no_framework=Failed to get instance of Framework
EquinoxPaths_uri_retrieval_error=Failed to retrieve URI from value "{0}" (property "{1}")
EquinoxRestrictions_feature_is_licensed=Feature "{0}" is licensed properly
EquinoxRestrictions_feature_is_not_licensed=Feature "{0}" is not licensed properly
Expand Down
Loading