package org.springframework.roo.settings.project;
import java.io.File;
import java.util.Map;
import java.util.SortedSet;
import java.util.logging.Logger;
import org.apache.commons.lang3.StringUtils;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.Service;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentContext;
import org.springframework.roo.process.manager.FileManager;
import org.springframework.roo.project.LogicalPath;
import org.springframework.roo.project.Path;
import org.springframework.roo.project.PathResolver;
import org.springframework.roo.propfiles.manager.PropFilesManagerService;
import org.springframework.roo.support.logging.HandlerUtils;
import org.springframework.roo.support.osgi.OSGiUtils;
import org.springframework.roo.support.util.FileUtils;
/**
*
* Project configuration manager implementation to manage the Spring Roo
* configuration stored in the properties file ".roo/config/project.properties"
*
* @author Paula Navarro
* @since 2.0
*/
@Component
@Service
public class ProjectSettingsServiceImpl implements ProjectSettingsService {
private static final Path PROJECT_CONFIG_FOLDER_LOCATION = Path.ROOT_ROO_CONFIG;
private static final String PROJECT_CONFIG_FILE_FOLDER = "config/";
private static final String PROJECT_CONFIG_FILE_NAME = "project.properties";
protected final static Logger LOGGER = HandlerUtils.getLogger(ProjectSettingsServiceImpl.class);
@Reference
private PathResolver pathResolver;
private PropFilesManagerService propFilesManager;
private FileManager fileManager;
// ------------ OSGi component attributes ----------------
private BundleContext context;
protected void activate(final ComponentContext context) {
this.context = context.getBundleContext();
}
@Override
public void addProperty(final String key, final String value, final boolean force) {
getPropFilesManager().addPropertyIfNotExists(
LogicalPath.getInstance(PROJECT_CONFIG_FOLDER_LOCATION, ""), getProjectSettingsFileName(),
key, value, force);
}
@Override
public void removeProperty(final String key) {
getPropFilesManager().removeProperty(
LogicalPath.getInstance(PROJECT_CONFIG_FOLDER_LOCATION, ""), getProjectSettingsFileName(),
key);
}
@Override
public Map<String, String> getProperties() {
return getPropFilesManager().getProperties(
LogicalPath.getInstance(PROJECT_CONFIG_FOLDER_LOCATION, ""), getProjectSettingsFileName());
}
@Override
public SortedSet<String> getPropertyKeys(boolean includeValues) {
return getPropFilesManager().getPropertyKeys(
LogicalPath.getInstance(PROJECT_CONFIG_FOLDER_LOCATION, ""), getProjectSettingsFileName(),
includeValues);
}
@Override
public String getProperty(final String key) {
return getPropFilesManager().getProperty(
LogicalPath.getInstance(PROJECT_CONFIG_FOLDER_LOCATION, ""), getProjectSettingsFileName(),
key);
}
@Override
public String getProjectSettingsLocation() {
return pathResolver.getFocusedIdentifier(PROJECT_CONFIG_FOLDER_LOCATION,
getProjectSettingsFileName());
}
@Override
public boolean existsProjectSettingsFile() {
return getFileManager().exists(getProjectSettingsLocation());
}
/**
* Method that generates application configuration filename path using
* project setting folder and filename. This filename has a ".project"
* extension.
*
* @return
*/
private String getProjectSettingsFileName() {
String fileName = PROJECT_CONFIG_FILE_FOLDER;
fileName = fileName.concat(PROJECT_CONFIG_FILE_NAME);
return fileName;
}
@Override
public void createProjectSettingsFile() {
getFileManager().createFile(getProjectSettingsLocation());
}
/**
* Method that finds the propFilesManagerService.
*
* @return the propFilesManagerService. Null is returned if service is not
* found
*/
public PropFilesManagerService getPropFilesManager() {
if (propFilesManager == null) {
// Get all Services implement PropFilesManagerService interface
try {
ServiceReference<?>[] references =
this.context.getAllServiceReferences(PropFilesManagerService.class.getName(), null);
for (ServiceReference<?> ref : references) {
propFilesManager = (PropFilesManagerService) this.context.getService(ref);
return propFilesManager;
}
return null;
} catch (InvalidSyntaxException e) {
LOGGER.warning("Cannot load PropFilesManagerService on ProjectSettingsServiceImpl.");
return null;
}
} else {
return propFilesManager;
}
}
/**
* Method that finds the filesManager.
*
* @return the filesManager. Null is returned if service is not found
*/
public FileManager getFileManager() {
if (fileManager == null) {
// Get all Services implement FileManager interface
try {
ServiceReference<?>[] references =
this.context.getAllServiceReferences(FileManager.class.getName(), null);
for (ServiceReference<?> ref : references) {
fileManager = (FileManager) this.context.getService(ref);
return fileManager;
}
return null;
} catch (InvalidSyntaxException e) {
LOGGER.warning("Cannot load FileManager on ProjectSettingsServiceImpl.");
return null;
}
} else {
return fileManager;
}
}
}