/**
* Copyright (c) Members of the EGEE Collaboration. 2006-2009.
* See http://www.eu-egee.org/partners/ for details on the copyright holders.
*
* 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.
*/
package org.glite.authz.pap.server;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.NoSuchElementException;
import java.util.TimeZone;
import javax.servlet.ServletContext;
import org.glite.authz.pap.authz.AuthorizationEngine;
import org.glite.authz.pap.common.PAPConfiguration;
import org.glite.authz.pap.common.Pap;
import org.glite.authz.pap.common.Version;
import org.glite.authz.pap.common.exceptions.PAPConfigurationException;
import org.glite.authz.pap.common.xacml.wizard.AttributeWizardTypeConfiguration;
import org.glite.authz.pap.distribution.DistributionModule;
import org.glite.authz.pap.monitoring.MonitoredProperties;
import org.glite.authz.pap.papmanagement.PapContainer;
import org.glite.authz.pap.papmanagement.PapManager;
import org.glite.authz.pap.repository.RepositoryManager;
import org.glite.authz.pap.repository.RepositoryUtils;
import org.glite.authz.pap.repository.exceptions.RepositoryException;
import org.joda.time.DateTime;
import org.joda.time.chrono.ISOChronology;
import org.opensaml.DefaultBootstrap;
import org.opensaml.xml.ConfigurationException;
import org.slf4j.Logger;
public final class PAPService {
static final Logger logger = org.slf4j.LoggerFactory
.getLogger(PAPService.class);
protected static void setStartupMonitoringProperties() {
// Property: service startup time
Calendar c = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
DateTime dt = new DateTime(c.getTimeInMillis())
.withChronology(ISOChronology.getInstanceUTC());
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.SERVICE_STARTUP_TIME_MILLIS_PROP_NAME,
c.getTimeInMillis());
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.SERVICE_STARTUP_TIME_PROP_NAME, dt);
PapManager papManager = PapManager.getInstance();
// Property: number of local policies
int numberOfLocalPolicies = 0;
for (PapContainer papContainer : PapContainer.getContainers(papManager
.getLocalPaps())) {
numberOfLocalPolicies += papContainer.getNumberOfPolicies();
}
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.NUM_OF_LOCAL_POLICIES_PROP_NAME,
numberOfLocalPolicies);
// Property: number of remote policies
int numOfRemotePolicies = 0;
for (PapContainer papContainer : PapContainer.getContainers(papManager
.getRemotePaps())) {
numOfRemotePolicies += papContainer.getNumberOfPolicies();
}
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.NUM_OF_REMOTE_POLICIES_PROP_NAME,
numOfRemotePolicies);
// Property: number of policies
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.NUM_OF_POLICIES_PROP_NAME,
numberOfLocalPolicies + numOfRemotePolicies);
// Property: policy last modification time
String policyLastModificationTimeString = papManager.getPap(
Pap.DEFAULT_PAP_ALIAS)
.getPolicyLastModificationTimeInMilliseconds();
DateTime policyLastModificationTime = new DateTime(Long.parseLong(policyLastModificationTimeString))
.withChronology(ISOChronology.getInstanceUTC());
PAPConfiguration
.instance()
.setMonitoringProperty(
MonitoredProperties.POLICY_LAST_MODIFICATION_TIME_MILLIS_PROP_NAME,
policyLastModificationTimeString);
PAPConfiguration.instance().setMonitoringProperty(
MonitoredProperties.POLICY_LAST_MODIFICATION_TIME_PROP_NAME,
policyLastModificationTime);
}
public static void start(ServletContext context) {
logger.info("Starting PAP service version {} ...",
Version.getServiceVersion());
// Initialize configuaration
PAPConfiguration conf = PAPConfiguration.initialize(context);
// Start autorization service
logger.info("Starting authorization engine...");
AuthorizationEngine.initialize(conf.getPapAuthzConfigurationFileName());
// Bootstrap opensaml
try {
logger.info("Bootstraping OpenSAML...");
DefaultBootstrap.bootstrap();
} catch (ConfigurationException e) {
logger.error("Error configuring OpenSAML:" + e.getMessage());
throw new PAPConfigurationException("Error configuring OpenSAML:"
+ e.getMessage(), e);
}
// Boostrap wizard attributes
String configFileName = PAPConfiguration.instance()
.getPAPConfigurationDir() + "/attribute-mappings.ini";
AttributeWizardTypeConfiguration.bootstrap(configFileName);
// Start repository manager
logger.info("Starting repository manager...");
RepositoryManager.bootstrap();
PapManager.initialize();
boolean performRepositoryValidationCheck;
try {
performRepositoryValidationCheck = PAPConfiguration.instance()
.getBoolean("repository.consistency_check");
} catch (NoSuchElementException e) {
performRepositoryValidationCheck = false;
logger.info("Skipping repository validation check");
}
if (performRepositoryValidationCheck) {
boolean repair;
try {
repair = PAPConfiguration.instance().getBoolean(
"repository.consistency_check.repair");
} catch (NoSuchElementException e) {
repair = false;
}
logger.info("Starting repository validation. repair=" + repair);
if (RepositoryUtils.performAllChecks(repair) == false) {
throw new RepositoryException(
"Repository validation check failed");
}
}
setStartupMonitoringProperties();
logger.info("Starting pap distribution module...");
DistributionModule.getInstance().startDistributionModule();
}
public static void stop() {
logger.info("Shutting down PAP service...");
logger.info("Shutting down distribution module...");
DistributionModule.getInstance().stopDistributionModule();
logger.info("Shutting down authorization module...");
if (AuthorizationEngine.instance() != null)
AuthorizationEngine.instance().shutdown();
logger.info("Disposing CANL validator...");
if (PAPConfiguration.instance().getCertchainValidator() != null)
PAPConfiguration.instance().getCertchainValidator().dispose();
logger.info("PAP service stopped.");
}
}