/*
* Copyright 2010-2015 Institut Pasteur.
*
* This file is part of Icy.
*
* Icy 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, either version 3 of the License, or
* (at your option) any later version.
*
* Icy 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 Icy. If not, see <http://www.gnu.org/licenses/>.
*/
package icy.preferences;
import icy.network.AuthenticationInfo;
import icy.network.NetworkUtil;
import icy.util.StringUtil;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author Stephane
*/
public class RepositoryPreferences
{
public static class RepositoryInfo
{
private static final String ID_NAME = "name";
private static final String ID_LOCATION = "location";
private static final String ID_ENABLED = "enabled";
private static final String ID_SUPPORTPARAM = "supportParam";
private static final String ID_AUTHENTICATION = "authentication";
private String name;
private String location;
private boolean supportParam;
private boolean enabled;
private final AuthenticationInfo authInf;
public RepositoryInfo(String name, String location, String login, String password, boolean authEnabled,
boolean enabled, boolean supportParam)
{
super();
this.name = name;
this.location = location;
this.supportParam = supportParam;
this.enabled = enabled;
authInf = new AuthenticationInfo(login, password, authEnabled);
}
public RepositoryInfo(String name, String location, String login, String password, boolean authEnabled,
boolean enabled)
{
this(name, location, login, password, authEnabled, enabled, true);
}
public RepositoryInfo(String name, String location, boolean enabled)
{
this(name, location, "", "", false, enabled);
}
public RepositoryInfo(String name, String location)
{
this(name, location, "", "", false, true);
}
public RepositoryInfo(XMLPreferences node)
{
this("", "", "", "", false, false);
load(node);
}
public boolean isEmpty()
{
return StringUtil.isEmpty(location);
}
/**
* @return the name
*/
public String getName()
{
return name;
}
/**
* @param name
* the name to set
*/
public void setName(String name)
{
this.name = name;
}
/**
* @return the location
*/
public String getLocation()
{
return location;
}
/**
* @param location
* the location to set
*/
public void setLocation(String location)
{
this.location = location;
}
/**
* @return the supportParam
*/
public boolean getSupportParam()
{
return supportParam;
}
/**
* @param supportParam
* the supportParam to set
*/
public void setSupportParam(boolean supportParam)
{
this.supportParam = supportParam;
}
/**
* /**
*
* @return the enabled
*/
public boolean isEnabled()
{
return enabled;
}
/**
* @param enabled
* the enabled to set
*/
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
/**
* @return the login
*/
public String getLogin()
{
return authInf.getLogin();
}
/**
* @param login
* the login to set
*/
public void setLogin(String login)
{
authInf.setLogin(login);
}
/**
* @return the password
*/
public String getPassword()
{
return authInf.getPassword();
}
/**
* @param password
* the password to set
*/
public void setPassword(String password)
{
authInf.setPassword(password);
}
/**
* @return the authentication enabled
*/
public boolean isAuthenticationEnabled()
{
return authInf.isEnabled();
}
/**
* @param value
* the authentication enabled to set
*/
public void setAuthenticationEnabled(boolean value)
{
authInf.setEnabled(value);
}
/**
* @return the authentication informations
*/
public AuthenticationInfo getAuthenticationInfo()
{
return authInf;
}
public void load(XMLPreferences node)
{
if (node != null)
{
name = node.get(ID_NAME, "");
location = node.get(ID_LOCATION, "");
enabled = node.getBoolean(ID_ENABLED, false);
supportParam = node.getBoolean(ID_SUPPORTPARAM, true);
authInf.load(node.node(ID_AUTHENTICATION));
}
}
public void save(XMLPreferences node)
{
if (node != null)
{
node.put(ID_NAME, name);
node.put(ID_LOCATION, location);
node.putBoolean(ID_ENABLED, enabled);
node.putBoolean(ID_SUPPORTPARAM, supportParam);
authInf.save(node.node(ID_AUTHENTICATION));
}
}
public boolean isDefault()
{
return RepositoryPreferences.DEFAULT_REPOSITERY_NAME.equals(name)
&& RepositoryPreferences.DEFAULT_REPOSITERY_LOCATION.equals(location);
}
public boolean isOldDefault()
{
return RepositoryPreferences.DEFAULT_REPOSITERY_NAME.equals(name)
&& RepositoryPreferences.DEFAULT_REPOSITERY_LOCATION_OLD.equals(location);
}
@Override
public String toString()
{
return name + " - " + location;
}
@Override
public int hashCode()
{
return name.hashCode() ^ location.hashCode() ^ authInf.hashCode();
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof RepositoryInfo)
{
final RepositoryInfo repoInf = (RepositoryInfo) obj;
return StringUtil.equals(repoInf.toString(), toString()) && repoInf.authInf.equals(authInf);
}
return super.equals(obj);
}
}
/**
* pref id
*/
private static final String PREF_ID = "repositories";
/**
* preferences
*/
private static XMLPreferences preferences;
public static final String DEFAULT_REPOSITERY_NAME = "default";
public static final String DEFAULT_REPOSITERY_LOCATION = NetworkUtil.WEBSITE_URL + "repository/";
public static final String DEFAULT_REPOSITERY_LOCATION_OLD = "http://www.bioimageanalysis.org/icy/repository/";
public static void load()
{
// load preference
preferences = ApplicationPreferences.getPreferences().node(PREF_ID);
}
/**
* @return the preferences
*/
public static XMLPreferences getPreferences()
{
return preferences;
}
public static ArrayList<RepositoryInfo> getRepositeries()
{
final Set<RepositoryInfo> result = new HashSet<RepositoryInfo>();
final List<String> childs = preferences.childrenNames();
for (String child : childs)
{
final RepositoryInfo reposInf = new RepositoryInfo(preferences.node(child));
// ignore empty and old default repository
if (!reposInf.isEmpty() && !reposInf.isOldDefault())
result.add(reposInf);
}
// add default repository if needed
result.add(new RepositoryInfo(DEFAULT_REPOSITERY_NAME, DEFAULT_REPOSITERY_LOCATION, true));
return new ArrayList<RepositoryInfo>(result);
}
public static void setRepositeries(ArrayList<RepositoryInfo> values)
{
// remove all child nodes
preferences.removeChildren();
int i = 0;
for (RepositoryInfo reposInf : values)
{
if (!reposInf.isEmpty())
reposInf.save(preferences.node("repos" + i));
i++;
}
// clean up all non element nodes
preferences.clean();
}
}