/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt * or http://forgerock.org/license/CDDLv1.0.html. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at legal-notices/CDDLv1_0.txt. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * * Copyright 2010 Sun Microsystems, Inc. * Portions Copyright 2014-2015 ForgeRock AS */ package org.opends.server.tools.dsreplication; import java.util.ArrayList; import java.util.LinkedList; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attribute; import javax.naming.directory.BasicAttribute; import javax.naming.directory.BasicAttributes; import org.forgerock.opendj.ldap.ByteString; import org.opends.server.admin.client.cli.TaskScheduleArgs; import org.opends.server.tools.tasks.TaskClient; import org.opends.server.tools.tasks.TaskScheduleUserData; import org.opends.server.types.RawAttribute; /** This class is used to store the information provided by the user to purge historical data. */ public class PurgeHistoricalUserData extends MonoServerReplicationUserData { private int maximumDuration; private boolean online; private TaskScheduleUserData taskSchedule = new TaskScheduleUserData(); /** Default constructor. */ public PurgeHistoricalUserData() { } /** * Returns the maximum duration that the purge can take in seconds. * @return the maximum duration that the purge can take in seconds. */ public int getMaximumDuration() { return maximumDuration; } /** * Sets the maximum duration that the purge can take in seconds. * @param maximumDuration the maximum duration that the purge can take in * seconds. */ public void setMaximumDuration(int maximumDuration) { this.maximumDuration = maximumDuration; } /** * Whether the task will be executed on an online server (using an LDAP * connection and the tasks backend) or not. * @return {@code true} if the task will be executed on an online server * and {@code false} otherwise. */ public boolean isOnline() { return online; } /** * Sets whether the task will be executed on an online server or not. * @param online {@code true} if the task will be executed on an online server * and {@code false} otherwise. */ public void setOnline(boolean online) { this.online = online; } /** * Returns the object describing the schedule of the task. If the operation * is not online, the value returned by this method should not be taken into * account. * @return the object describing the schedule of the task. */ public TaskScheduleUserData getTaskSchedule() { return taskSchedule; } /** * Sets the object describing the schedule of the task. * @param taskSchedule the object describing the schedule of the task. */ public void setTaskSchedule(TaskScheduleUserData taskSchedule) { this.taskSchedule = taskSchedule; } /** * Initializes the contents of the provided purge historical replication user * data object with what was provided in the command-line without prompting to * the user. * @param uData the purge historical replication user data object to be * initialized. * @param argParser the argument parser with the arguments provided by the * user. */ public static void initializeWithArgParser(PurgeHistoricalUserData uData, ReplicationCliArgumentParser argParser) { uData.setBaseDNs(new LinkedList<String>(argParser.getBaseDNs())); if (argParser.connectionArgumentsPresent()) { uData.setAdminUid(argParser.getAdministratorUIDOrDefault()); uData.setAdminPwd(argParser.getBindPasswordAdmin()); uData.setHostName(argParser.getHostNameToStatusOrDefault()); uData.setPort(argParser.getPortToStatusOrDefault()); uData.setOnline(true); TaskScheduleUserData taskSchedule = new TaskScheduleUserData(); TaskScheduleArgs taskArgs = argParser.getTaskArgsList(); taskSchedule.setStartNow(taskArgs.isStartNow()); if (!taskSchedule.isStartNow()) { taskSchedule.setStartDate(taskArgs.getStartDateTime()); taskSchedule.setDependencyIds(taskArgs.getDependencyIds()); taskSchedule.setFailedDependencyAction( taskArgs.getFailedDependencyAction()); taskSchedule.setNotifyUponErrorEmailAddresses( taskArgs.getNotifyUponErrorEmailAddresses()); taskSchedule.setNotifyUponCompletionEmailAddresses( taskArgs.getNotifyUponCompletionEmailAddresses()); taskSchedule.setRecurringDateTime( taskArgs.getRecurringDateTime()); } uData.setTaskSchedule(taskSchedule); } else { uData.setOnline(false); } uData.setMaximumDuration(argParser.getMaximumDurationOrDefault()); } /** * Commodity method that returns the list of basic task attributes required * to launch a task corresponding to the provided user data. * @param uData the user data describing the purge historical to be executed. * @return the list of basic task attributes required * to launch a task corresponding to the provided user data. */ public static BasicAttributes getTaskAttributes(PurgeHistoricalUserData uData) { PurgeHistoricalScheduleInformation information = new PurgeHistoricalScheduleInformation(uData); return getAttributes(TaskClient.getTaskAttributes(information)); } private static BasicAttributes getAttributes(ArrayList<RawAttribute> rawAttrs) { BasicAttributes attrs = new BasicAttributes(); for (RawAttribute rawAttr : rawAttrs) { BasicAttribute attr = new BasicAttribute(rawAttr.getAttributeType()); for (ByteString v : rawAttr.getValues()) { attr.add(v.toString()); } attrs.put(attr); } return attrs; } /** * Returns the DN of the task corresponding to the provided list of * attributes. The code assumes that the attributes have been generated * calling the method {@link #getTaskAttributes(PurgeHistoricalUserData)}. * @param attrs the attributes of the task entry. * @return the DN of the task entry. */ public static String getTaskDN(BasicAttributes attrs) { ArrayList<RawAttribute> rawAttrs = getRawAttributes(attrs); return TaskClient.getTaskDN(rawAttrs); } /** * Returns the ID of the task corresponding to the provided list of * attributes. The code assumes that the attributes have been generated * calling the method {@link #getTaskAttributes(PurgeHistoricalUserData)}. * @param attrs the attributes of the task entry. * @return the ID of the task entry. */ public static String getTaskID(BasicAttributes attrs) { ArrayList<RawAttribute> rawAttrs = getRawAttributes(attrs); return TaskClient.getTaskID(rawAttrs); } private static ArrayList<RawAttribute> getRawAttributes(BasicAttributes attrs) { try { ArrayList<RawAttribute> rawAttrs = new ArrayList<>(); NamingEnumeration<Attribute> nAtt = attrs.getAll(); while (nAtt.hasMore()) { Attribute attr = nAtt.next(); NamingEnumeration<?> values = attr.getAll(); ArrayList<ByteString> rawValues = new ArrayList<>(); while (values.hasMore()) { Object v = values.next(); rawValues.add(ByteString.valueOfUtf8(v.toString())); } RawAttribute rAttr = RawAttribute.create(attr.getID(), rawValues); rawAttrs.add(rAttr); } return rawAttrs; } catch (NamingException ne) { // This is a bug. throw new RuntimeException("Unexpected error: "+ne, ne); } } }