/*
*
* * Copyright 2014 Orient Technologies LTD (info(at)orientechnologies.com)
* *
* * Licensed under the Apache License, Version 2.0 (the "License");
* * you may not use this file except in compliance with the License.
* * You may obtain a copy of the License at
* *
* * http://www.apache.org/licenses/LICENSE-2.0
* *
* * Unless required by applicable law or agreed to in writing, software
* * distributed under the License is distributed on an "AS IS" BASIS,
* * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* * See the License for the specific language governing permissions and
* * limitations under the License.
* *
* * For more information: http://www.orientechnologies.com
*
*/
package com.orientechnologies.orient.server.config;
import com.orientechnologies.common.exception.OException;
import com.orientechnologies.orient.core.exception.OConfigurationException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
/**
* Server configuration manager. It manages the orientdb-server-config.xml file.
*
* @author Luca Garulli
*/
public class OServerConfigurationManager {
private final OServerConfigurationLoaderXml configurationLoader;
private OServerConfiguration configuration;
private Map<String, OServerUserConfiguration> ephemeralUsers = new ConcurrentHashMap<String, OServerUserConfiguration>();
public OServerConfigurationManager(final InputStream iInputStream) throws IOException {
configurationLoader = new OServerConfigurationLoaderXml(OServerConfiguration.class, iInputStream);
configuration = configurationLoader.load();
}
public OServerConfigurationManager(final File iFile) throws IOException {
configurationLoader = new OServerConfigurationLoaderXml(OServerConfiguration.class, iFile);
configuration = configurationLoader.load();
}
public OServerConfigurationManager(final OServerConfiguration iConfiguration) {
configurationLoader = null;
configuration = iConfiguration;
}
public OServerConfiguration getConfiguration() {
return configuration;
}
public OServerConfigurationManager setUser(final String iServerUserName, final String iServerUserPasswd, final String iPermissions) {
if (iServerUserName == null || iServerUserName.length() == 0)
throw new IllegalArgumentException("User name is null or empty");
// An empty password is permissible as some security implementations do not require it.
if (iServerUserPasswd == null)
throw new IllegalArgumentException("User password is null or empty");
if (iPermissions == null || iPermissions.length() == 0)
throw new IllegalArgumentException("User permissions is null or empty");
int userPositionInArray = -1;
if (configuration.users == null) {
configuration.users = new OServerUserConfiguration[1];
userPositionInArray = 0;
} else {
// LOOK FOR EXISTENT USER
for (int i = 0; i < configuration.users.length; ++i) {
final OServerUserConfiguration u = configuration.users[i];
if (u != null && iServerUserName.equalsIgnoreCase(u.name)) {
// FOUND
userPositionInArray = i;
break;
}
}
if (userPositionInArray == -1) {
// NOT FOUND
userPositionInArray = configuration.users.length;
configuration.users = Arrays.copyOf(configuration.users, configuration.users.length + 1);
}
}
configuration.users[userPositionInArray] = new OServerUserConfiguration(iServerUserName, iServerUserPasswd, iPermissions);
return this;
}
public void saveConfiguration() throws IOException {
if (configurationLoader == null)
return;
configurationLoader.save(configuration);
}
public OServerUserConfiguration setEphemeralUser(final String username, final String password, final String resources)
{
OServerUserConfiguration userCfg = new OServerUserConfiguration(username, password, resources);
ephemeralUsers.put(username, userCfg);
return userCfg;
}
public OServerUserConfiguration getUser(final String iServerUserName) {
if (iServerUserName == null || iServerUserName.length() == 0) {
throw new IllegalArgumentException("User name is null or empty");
}
checkForAutoReloading();
if (configuration.users != null) {
for (OServerUserConfiguration user : configuration.users) {
if (iServerUserName.equalsIgnoreCase(user.name)) {
// FOUND
return user;
}
}
}
// Check the ephemeral users too.
for (OServerUserConfiguration user : ephemeralUsers.values()) {
if (iServerUserName.equalsIgnoreCase(user.name)) {
// FOUND
return user;
}
}
return null;
}
public boolean existsUser(final String iServerUserName) {
return getUser(iServerUserName) != null;
}
public void dropUser(final String iServerUserName) {
if (iServerUserName == null || iServerUserName.length() == 0) {
throw new IllegalArgumentException("User name is null or empty");
}
checkForAutoReloading();
// LOOK FOR EXISTENT USER
for (int i = 0; i < configuration.users.length; ++i) {
final OServerUserConfiguration u = configuration.users[i];
if (u != null && iServerUserName.equalsIgnoreCase(u.name)) {
// FOUND
final OServerUserConfiguration[] newArray = new OServerUserConfiguration[configuration.users.length - 1];
// COPY LEFT PART
for (int k = 0; k < i; ++k) {
newArray[k] = configuration.users[k];
}
// COPY RIGHT PART
for (int k = i; k < newArray.length; ++k) {
newArray[k] = configuration.users[k + 1];
}
configuration.users = newArray;
break;
}
}
}
public Set<OServerUserConfiguration> getUsers() {
checkForAutoReloading();
final HashSet<OServerUserConfiguration> result = new HashSet<OServerUserConfiguration>();
for (int i = 0; i < configuration.users.length; ++i) {
if (configuration.users[i] != null)
result.add(configuration.users[i]);
}
for (OServerUserConfiguration user : ephemeralUsers.values()) {
result.add(user);
}
return result;
}
private void checkForAutoReloading() {
if (configurationLoader != null)
if (configurationLoader.checkForAutoReloading()) {
try {
configuration = configurationLoader.load();
} catch (IOException e) {
throw OException.wrapException(new OConfigurationException("Cannot load server configuration"), e);
}
}
}
}