/* * Copyright 2004 - 2010 Christian Sprajc. All rights reserved. * * This file is part of PowerFolder. * * PowerFolder is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation. * * PowerFolder 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 * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PowerFolder. If not, see <http://www.gnu.org/licenses/>. * * $Id: OnlineStorageSubscription.java 13338 2010-08-11 13:48:33Z tot $ */ package de.dal33t.powerfolder.security; import java.util.Collection; import java.util.Comparator; import java.util.Map; import java.util.TreeSet; import java.util.Map.Entry; import de.dal33t.powerfolder.Member; import de.dal33t.powerfolder.clientserver.SecurityService; import de.dal33t.powerfolder.disk.Folder; import de.dal33t.powerfolder.light.AccountInfo; /** * Model that holds extended information about a folder {@link Member} and/or * {@link AccountInfo} and it's {@link Permission} * * @author sprajc */ public class MemberAccountPermission { private Folder folder; private Member member; private AccountInfo accountInfo; private FolderPermission permission; public MemberAccountPermission(Folder folder, Member member, AccountInfo accountInfo, FolderPermission permission) { super(); this.folder = folder; this.member = member; this.accountInfo = accountInfo; this.permission = permission; } /** * @param folder * @param folderPermissions * retriever by * {@link SecurityService#getFolderPermissions(de.dal33t.powerfolder.light.FolderInfo)} * @return the prepared list of {@link MemberAccountPermission}s */ public static Collection<MemberAccountPermission> collect(Folder folder, Map<AccountInfo, FolderPermission> folderPermissions) { Collection<MemberAccountPermission> members = new TreeSet<MemberAccountPermission>( MemberAccountPermission.ComparatorType.BY_COMPUTER_NAME_DISPLAY_NAME); // Step 1) All computers. members.clear(); for (Member member : folder.getMembersAsCollection()) { AccountInfo aInfo = member.getAccountInfo(); FolderPermission folderPermission = folderPermissions.get(aInfo); MemberAccountPermission folderMember = new MemberAccountPermission( folder, member, aInfo, folderPermission); members.add(folderMember); } for (Member member : folder.getMembersAsCollection()) { AccountInfo aInfo = member.getAccountInfo(); if (aInfo != null) { folderPermissions.remove(aInfo); } } // Step 2) All other users not joined with any computer. if (!folderPermissions.isEmpty()) { for (Entry<AccountInfo, FolderPermission> permissionInfo : folderPermissions .entrySet()) { MemberAccountPermission folderMember = new MemberAccountPermission( folder, null, permissionInfo.getKey(), permissionInfo .getValue()); members.add(folderMember); } } return members; } public Folder getFolder() { return folder; } public Member getMember() { return member; } public AccountInfo getAccountInfo() { return accountInfo; } public FolderPermission getPermission() { return permission; } public enum ComparatorType implements Comparator<MemberAccountPermission> { /** Sorts members by connected / disconnected and friend / non-friend. */ BY_TYPE() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { Member member1 = o1.getMember(); Member member2 = o2.getMember(); if (member1 == null) { return member2 == null ? 0 : -1; } if (member2 == null) { return 1; } // Sort by type. boolean m1f = member1.isFriend(); boolean m2f = member2.isFriend(); boolean m1cc = member1.isCompletelyConnected() || member1.isMySelf(); boolean m2cc = member2.isCompletelyConnected() || member2.isMySelf(); if (m1f != m2f) { return m1f ? 1 : -1; } if (m1cc != m2cc) { return m1cc ? 1 : -1; } return 0; } }, BY_COMPUTER_NAME() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { Member member1 = o1.getMember(); Member member2 = o2.getMember(); if (member1 == null) { return member2 == null ? 0 : 1; } if (member2 == null) { return -1; } // Sort by nick name return member1.getNick().compareTo(member2.getNick()); } }, BY_COMPUTER_NAME_DISPLAY_NAME() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { int i = BY_COMPUTER_NAME.compare(o1, o2); if (i == 0) { i = BY_DISPLAY_NAME.compare(o1, o2); } return i; } }, BY_SYNC_STATUS() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { Double size1 = o1.getFolder().getStatistic().getSyncPercentage( o1.getMember()); Double size2 = o2.getFolder().getStatistic().getSyncPercentage( o2.getMember()); if (size1 == null) { return size2 == null ? 0 : -1; } if (size2 == null) { return 1; } return size1.compareTo(size2); } }, BY_LOCAL_SIZE() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { Long size1 = o1.getFolder().getStatistic().getSizeInSync( o1.getMember()); Long size2 = o2.getFolder().getStatistic().getSizeInSync( o2.getMember()); if (size1 == null) { return size2 == null ? 0 : 1; } if (size2 == null) { return -1; } return size1.compareTo(size2); } }, BY_USERNAME() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { AccountInfo a1 = o1.getAccountInfo(); AccountInfo a2 = o2.getAccountInfo(); if (a1 == null) { return a2 == null ? 0 : 1; } if (a2 == null) { return -1; } if (a1.getUsername() == null) { return a2.getUsername() == null ? 0 : 1; } if (a2.getUsername() == null) { return -1; } return a1.getUsername().compareTo(a2.getUsername()); } }, BY_DISPLAY_NAME() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { AccountInfo a1 = o1.getAccountInfo(); AccountInfo a2 = o2.getAccountInfo(); if (a1 == null) { return a2 == null ? 0 : 1; } if (a2 == null) { return -1; } if (a1.getDisplayName() == null) { return a2.getDisplayName() == null ? 0 : 1; } if (a2.getDisplayName() == null) { return -1; } return a1.getDisplayName().compareTo(a2.getDisplayName()); } }, BY_PERMISSION() { @Override public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { FolderPermission fp1 = o1.getPermission(); FolderPermission fp2 = o2.getPermission(); if (fp1 == null) { return fp2 == null ? 0 : -1; } if (fp2 == null) { return 1; } return fp1.getName().compareTo(fp2.getName()); } } ; public int compare(MemberAccountPermission o1, MemberAccountPermission o2) { throw new UnsupportedOperationException("Not implemented"); } } }