/* Copyright (C) 2009 Mobile Sorcery AB
This program is free software; you can redistribute it and/or modify it
under the terms of the Eclipse Public License v1.0.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for
more details.
You should have received a copy of the Eclipse Public License v1.0 along
with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html
*/
package com.mobilesorcery.sdk.profiles.filter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.ui.IMemento;
import com.mobilesorcery.sdk.core.MoSyncTool;
import com.mobilesorcery.sdk.core.Util;
import com.mobilesorcery.sdk.profiles.IProfile;
import com.mobilesorcery.sdk.profiles.IVendor;
import com.mobilesorcery.sdk.profiles.filter.elementfactories.ProfileFilterFactory;
public class ProfileFilter extends AbstractDeviceFilter {
private final TreeSet<IProfile> profiles = new TreeSet<IProfile>();
private final int profileManagerType;
public ProfileFilter() {
this(MoSyncTool.LEGACY_PROFILE_TYPE);
}
public ProfileFilter(int profileManagerType) {
this.profileManagerType = profileManagerType;
}
public void setVendors(IVendor[] vendorsToAccept, boolean add) {
for (int i = 0; i < vendorsToAccept.length; i++) {
setVendor(vendorsToAccept[i], add);
}
}
public void setVendors(String[] vendorNames) {
for (int i = 0; i < vendorNames.length; i++) {
setVendor(MoSyncTool.getDefault().getProfileManager(profileManagerType).getVendor(vendorNames[i]), true);
}
}
public void setProfiles(IProfile[] profilesToAccept, boolean add) {
for (int i = 0; i < profilesToAccept.length; i++) {
setProfile(profilesToAccept[i], add);
}
}
public void setProfiles(String[] profileNames) {
for (int i = 0; i < profileNames.length; i++) {
setProfile(MoSyncTool.getDefault().getProfileManager(profileManagerType).getProfile(profileNames[i]), true);
}
}
public void setVendor(IVendor vendor, boolean add) {
if (vendor == null) {
return;
}
setProfiles(vendor.getProfiles(), add);
}
public void setProfile(IProfile profile, boolean add) {
if (profile == null) {
return;
}
if (add) {
profiles.add(profile);
} else {
profiles.remove(profile);
}
}
@Override
public boolean acceptProfile(IProfile profile) {
boolean acceptIfRequired = profiles.contains(profile);
return required == acceptIfRequired;
}
public Set<IVendor> getVendorsWithAllProfilesAccepted() {
TreeSet<IVendor> result = new TreeSet<IVendor>();
TreeSet<IProfile> copyOfProfiles = new TreeSet<IProfile>(profiles);
while (!copyOfProfiles.isEmpty()) {
IProfile profile = copyOfProfiles.first();
IVendor vendor = profile.getVendor();
IProfile[] profilesForVendor = vendor.getProfiles();
int profileCount = profilesForVendor.length;
int profilesBefore = copyOfProfiles.size();
copyOfProfiles.removeAll(Arrays.asList(profilesForVendor));
int profilesAfter = copyOfProfiles.size();
if (profilesBefore - profilesAfter == profileCount) {
result.add(vendor);
}
copyOfProfiles.remove(profile); // Well, just in case...
}
return result;
}
private IProfile[] getProfilesWithoutVendor(Set vendors) {
ArrayList<IProfile> result = new ArrayList<IProfile>();
IProfile[] profiles = this.profiles.toArray(new IProfile[this.profiles.size()]);
for (int i = 0; i < profiles.length; i++) {
if (!vendors.contains(profiles[i].getVendor())) {
result.add(profiles[i]);
}
}
return result.toArray(new IProfile[result.size()]);
}
private String vendorString(Set<IVendor> vendors) {
if (vendors.size() == 0) {
return "";
}
String vendorList = Util.join(vendors.toArray(new IVendor[vendors.size()]), ", ");
String vendorCaption = vendors.size() == 1 ? "vendor: " : "vendors: ";
return vendorCaption + vendorList;
}
private String profileString(IProfile[] profiles) {
if (profiles.length == 0) {
return "";
}
String profileList = Util.join(profiles, ", ");
String profileCaption = profiles.length == 1 ? "profile: " : "profiles: ";
return profileCaption + profileList;
}
@Override
public String toString() {
String vendors = vendorString(getVendorsWithAllProfilesAccepted());
String profiles = profileString(getProfilesWithoutVendor(getVendorsWithAllProfilesAccepted()));
String delim = (vendors.length() > 0 && profiles.length() > 0) ? "; " : "";
return (required ? "Required " : "Disallowed ") + vendors + delim + profiles;
}
@Override
public void saveState(IMemento memento) {
Set<IVendor> vendors = getVendorsWithAllProfilesAccepted();
memento.putString("vendors", Util.join(vendors.toArray(new IVendor[vendors.size()]), ","));
memento.putString("profiles", Util.join(getProfilesWithoutVendor(vendors), ","));
memento.putInteger("require", required ? REQUIRE : DISALLOW);
memento.putInteger("mgr", profileManagerType);
}
public void clear() {
profiles.clear();
}
public IProfile[] getProfiles() {
return profiles.toArray(new IProfile[profiles.size()]);
}
@Override
public String getFactoryId() {
return ProfileFilterFactory.ID;
}
}