/**
* Warlock, the open-source cross-platform game client
*
* Copyright 2008, Warlock LLC, and individual contributors as indicated
* by the @authors tag.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package cc.warlock.core.stormfront;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import cc.warlock.core.configuration.Account;
import cc.warlock.core.configuration.IConfigurationProvider;
import cc.warlock.core.configuration.Profile;
import cc.warlock.core.configuration.WarlockConfiguration;
public class ProfileConfiguration implements IConfigurationProvider {
public static final String PROFILE_CONFIGURATION_FILE = "profiles.xml";
protected static ProfileConfiguration _instance;
public static ProfileConfiguration instance() {
if (_instance == null) _instance = new ProfileConfiguration();
return _instance;
}
public static WarlockConfiguration getProfileConfiguration ()
{
return WarlockConfiguration.getWarlockConfiguration(PROFILE_CONFIGURATION_FILE);
}
// TODO - determine if accounts should be synchronized
protected HashMap<String, Account> accounts = new HashMap<String, Account>();
protected ProfileConfiguration () {
WarlockConfiguration.getWarlockConfiguration(PROFILE_CONFIGURATION_FILE).addConfigurationProvider(this);
}
public List<Element> getTopLevelElements() {
ArrayList<Element> elements = new ArrayList<Element>();
for (Account account : accounts.values())
{
Element aElement = DocumentHelper.createElement("account");
aElement.addAttribute("name", account.getAccountName());
aElement.addAttribute("password", Account.encryptPassword(account.getPassword()));
for (Profile profile : account.getProfiles())
{
Element pElement = aElement.addElement("profile");
pElement.addAttribute("id", profile.getId());
pElement.addAttribute("name", profile.getName());
pElement.addAttribute("gameCode", profile.getGameCode());
pElement.addAttribute("gameName", profile.getGameName());
}
elements.add(aElement);
}
return elements;
}
public void parseElement(Element element) {
if (element.getName().equals("account"))
{
String accountName = element.attributeValue("name");
String password = element.attributeValue("password");
Account account = new Account(accountName, Account.decryptPassword(password));
accounts.put(accountName, account);
for (Element pElement : (List<Element>)element.elements())
{
String profileId = pElement.attributeValue("id");
String profileName = pElement.attributeValue("name");
String gameCode = pElement.attributeValue("gameCode");
String gameName = pElement.attributeValue("gameName");
Profile profile = new Profile();
profile.setAccount(account);
profile.setId(profileId);
profile.setName(profileName);
profile.setGameCode(gameCode);
profile.setGameName(gameName);
account.getProfiles().add(profile);
}
}
}
public boolean supportsElement(Element element) {
if (element.getName().equals("account") || element.getName().equals("profile"))
{
return true;
}
return false;
}
public void addAccount (Account account)
{
accounts.put(account.getAccountName(), account);
}
public void removeAccount (Account account)
{
accounts.remove(account.getAccountName());
}
public Account getAccount (String accountName)
{
if (accounts.containsKey(accountName))
return accounts.get(accountName);
return null;
}
public Collection<Account> getAllAccounts ()
{
return accounts.values();
}
public Collection<Profile> getAllProfiles ()
{
ArrayList<Profile> allProfiles = new ArrayList<Profile>();
for (Account acct : getAllAccounts())
{
allProfiles.addAll(acct.getProfiles());
}
return allProfiles;
}
public Profile getProfileByCharacterName (String characterName)
{
Collection<Profile> profiles = getAllProfiles();
for (Profile profile : profiles)
{
if (profile.getName().equals(characterName))
return profile;
}
return null;
}
}