/*
* Copyright (C) 2015 Jan Pokorsky
*
* This program 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.
*
* 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package cz.cas.lib.proarc.common.config;
import cz.cas.lib.proarc.common.imports.ImportProfile;
import java.io.File;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.configuration.Configuration;
/**
* This manages the configuration profiles.
*
* @author Jan Pokorsky
*/
public class Profiles {
private static final Logger LOG = Logger.getLogger(Profiles.class.getName());
private final Configuration config;
private final URI configHomeUri;
public Profiles(Configuration config, File configHome) {
this.config = config;
this.configHomeUri = configHome.toURI();
}
/**
* Finds a profile ID among registered profiles of a given type.
* Profiles with invalid file path are considered as not found.
* @param profileGroup e.g. {@link ImportProfile#PROFILES}
* @param profileId ID to search
* @return the found profile or {@code null}
*/
public ConfigurationProfile getProfile(String profileGroup, String profileId) {
if (profileGroup == null) {
throw new NullPointerException("profileGroup");
}
for (String registeredId : getGroupIds(profileGroup)) {
if (registeredId.equals(profileId)) {
return getProfile(profileId);
}
}
return null;
}
/**
* Gets a profile. The profile may not be part of any group.
* Profiles with invalid file path are considered as not found.
* @param profileId ID to search
* @return the found profile or {@code null}
*/
public ConfigurationProfile getProfile(String profileId) {
if (profileId == null) {
return null;
}
String label = config.getString(profileId + ".label", profileId);
String dsc = config.getString(profileId + ".description", label);
String filePath = config.getString(profileId + ".file", null);
ConfigurationProfile profile = new ConfigurationProfile(profileId);
File file = getProfileFile(profile, filePath);
profile.setDescription(dsc);
profile.setFile(file);
profile.setLabel(label);
return profile;
}
private File getProfileFile(ConfigurationProfile profile, String filePath) {
if (filePath == null) {
if (ConfigurationProfile.DEFAULT.equals(profile.getId())
|| ConfigurationProfile.DEFAULT_ARCHIVE_IMPORT.equals(profile.getId())) {
// default profile
return null;
}
filePath = profile.getId() + ".cfg";
}
try {
URI profileUri = configHomeUri.resolve(filePath);
return new File(profileUri);
} catch (Exception e) {
String err = String.format("Cannot resolve path '%s'!",filePath);
LOG.log(Level.SEVERE, "Profile {0}. Cannot resolve path {1}!",
new Object[]{profile.getId(), filePath});
profile.setError(err);
return null;
}
}
public List<ConfigurationProfile> getProfiles(String profileGroup) {
String[] ids = getGroupIds(profileGroup);
ArrayList<ConfigurationProfile> profiles = new ArrayList<ConfigurationProfile>(ids.length);
for (String id : ids) {
ConfigurationProfile profile = getProfile(id);
if (profile != null) {
profiles.add(profile);
}
}
return profiles;
}
private String[] getGroupIds(String profileGroup) {
String[] ids = config.getStringArray(profileGroup);
return ids;
}
}