package com.mobilesorcery.sdk.capabilities.devices;
import com.mobilesorcery.sdk.capabilities.core.AddDeviceFilterChangeRequest;
import com.mobilesorcery.sdk.capabilities.core.CompoundChangeRequest;
import com.mobilesorcery.sdk.capabilities.core.ICapabilitiesMatcher;
import com.mobilesorcery.sdk.capabilities.core.IChangeRequest;
import com.mobilesorcery.sdk.core.CapabilityState;
import com.mobilesorcery.sdk.core.ICapabilities;
import com.mobilesorcery.sdk.core.MoSyncProject;
import com.mobilesorcery.sdk.profiles.filter.DeviceCapabilitiesFilter;
public class DeviceCapabilitiesMatcher implements ICapabilitiesMatcher {
public DeviceCapabilitiesMatcher() {
}
@Override
public IChangeRequest match(MoSyncProject project,
ICapabilities requestedCapabilites) {
CompoundChangeRequest result = new CompoundChangeRequest("Remove devices that lacks required capabilities", project);
/*for (String requestedCapability : requestedCapabilites.listCapabilities()) {
AddDeviceFilterChangeRequest changeRequest;
for (CapabilityState disallowedCapabilityState : CapabilityState.values()) {
DeviceCapabilitiesFilter filter = new DeviceCapabilitiesFilter(requestedCapability, disallowedCapabilityState);
changeRequest = new AddDeviceFilterChangeRequest(project, filter);
changeRequest.setMessage(createChangeRequestMessage(requestedCapability, disallowedCapabilityState));
if (disallowedCapabilityState != CapabilityState.SUPPORTED && changeRequest.isApplicable()) {
result.addChangeRequest(changeRequest);
result.setShouldApply(changeRequest, disallowedCapabilityState == CapabilityState.NOT_IMPLEMENTED || disallowedCapabilityState == CapabilityState.UNSUPPORTED);
}
}
}*/
// ABOVE TEMPORARILY REMOVED!
return result.getChangeRequests().length > 0 ? result : null;
}
private String createChangeRequestMessage(String requestedCapability,
CapabilityState disallowedCapabilityState) {
switch (disallowedCapabilityState) {
case NOT_IMPLEMENTED:
return requestedCapability + ": Remove {0} devices for which this capability is not yet implemented";
case UNSUPPORTED:
return requestedCapability + ": Remove {0} devices that do not support this capability";
case REQUIRES_PERMISSION:
return requestedCapability + ": Remove {0} devices that requires permissions to be set for this capability";
case REQUIRES_PRIVILEGED_PERMISSION:
return requestedCapability + ": Remove {0} devices that requires privileged permissions (eg operator certs) to be set for this capability";
default:
return "?";
}
// " + requestedCapability);
}
/*public IChangeRequest match(MoSyncProject project,
ICapabilities requestedCapabilites) {
IApplicationPermissions permissions = project.getPermissions();
IProfile[] profiles = project.getFilteredProfiles();
HashMap<String, Map<CapabilityState, List<IProfile>>> capabilityStates = new HashMap<String, Map<CapabilityState,List<IProfile>>>();
for (IProfile profile : profiles) {
ICapabilities profileCapabilities = DeviceCapabilitesPlugin.getDefault().getCapabilitiesForProfile(profile);
for (String requestedCapability : requestedCapabilites.listCapabilities()) {
CapabilityState capabilityState = (CapabilityState) profileCapabilities.getCapabilityValue(requestedCapability);
if (capabilityState == null) {
capabilityState = CapabilityState.UNSUPPORTED;
}
if (capabilityState != CapabilityState.SUPPORTED && !permissions.isPermissionRequested(requestedCapability)) {
Map<CapabilityState, List<IProfile>> missingCapabilities = capabilityStates.get(requestedCapability);
if (missingCapabilities == null) {
missingCapabilities = new HashMap<CapabilityState, List<IProfile>>();
capabilityStates.put(requestedCapability, missingCapabilities);
}
List<IProfile> profileList = missingCapabilities.get(capabilityState);
if (profileList == null) {
profileList = new ArrayList<IProfile>();
missingCapabilities.put(capabilityState, profileList);
}
profileList.add(profile);
}
}
}
if (!capabilityStates.isEmpty()) {
return createChangeRequest(project, capabilityStates);
}
return null;
}
private IChangeRequest createChangeRequest(MoSyncProject project,
HashMap<String, Map<CapabilityState, List<IProfile>>> capabilityStates) {
CompoundChangeRequest result = new CompoundChangeRequest("Remove devices that lacks required capabilities", project);
for (String requestedCapability : capabilityStates.keySet()) {
Map<CapabilityState, List<IProfile>> profilesWithLackingCapabilities = capabilityStates.get(requestedCapability);
if (!profilesWithLackingCapabilities.isEmpty()) {
CompoundChangeRequest requestedCapabilityChangeRequest = new CompoundChangeRequest(MessageFormat.format("Missing required capability: {0}", requestedCapability), project);
requestedCapabilityChangeRequest.setParent(result);
result.addChangeRequest(requestedCapabilityChangeRequest);
for (CapabilityState state : profilesWithLackingCapabilities.keySet()) {
ProfileFilter filter = new ProfileFilter();
filter.setProfiles(profilesWithLackingCapabilities.get(state).toArray(new IProfile[0]), true);
AddDeviceFilterChangeRequest changeRequest = new AddDeviceFilterChangeRequest(project, filter);
requestedCapabilityChangeRequest.addChangeRequest(changeRequest);
if (state == CapabilityState.NOT_IMPLEMENTED || state == CapabilityState.UNSUPPORTED) {
changeRequest.setMessage("Remove {0} devices that do not support the capabilities needed for this project");
} else if (state == CapabilityState.REQUIRES_PERMISSION) {
changeRequest.setMessage("Remove {0} devices that requires permisson for the capabilities needed for this project");
} else if (state == CapabilityState.REQUIRES_PRIVILEGED_PERMISSION) {
changeRequest.setMessage("Remove {0} devices that requires special privileges (such as operator certificates) for the capabilities needed for this project");
requestedCapabilityChangeRequest.setShouldApply(changeRequest, false);
}
}
}
}
return result;
}*/
}