/* * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE * or https://OpenDS.dev.java.net/OpenDS.LICENSE. * 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 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. 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. */ 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.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.ByteString; 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()) { String adminUid = getValue(argParser.getAdministratorUID(), argParser.getDefaultAdministratorUID()); uData.setAdminUid(adminUid); String adminPwd = argParser.getBindPasswordAdmin(); uData.setAdminPwd(adminPwd); String hostName = getValue(argParser.getHostNameToStatus(), argParser.getDefaultHostNameToStatus()); uData.setHostName(hostName); int port = getValue(argParser.getPortToStatus(), argParser.getDefaultPortToStatus()); uData.setPort(port); 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(getValue(argParser.getMaximumDuration(), argParser.getDefaultMaximumDuration())); } /** * Commodity method that simply checks if a provided value is null or not, * if it is not <CODE>null</CODE> returns it and if it is <CODE>null</CODE> * returns the provided default value. * @param v the value to analyze. * @param defaultValue the default value. * @return if the provided value is not <CODE>null</CODE> returns it and if it * is <CODE>null</CODE> returns the provided default value. */ private static String getValue(String v, String defaultValue) { if (v != null) { return v; } else { return defaultValue; } } /** * Commodity method that simply checks if a provided value is -1 or not, * if it is not -1 returns it and if it is -1 returns the provided default * value. * @param v the value to analyze. * @param defaultValue the default value. * @return if the provided value is not -1 returns it and if it is -1 returns * the provided default value. */ private static int getValue(int v, int defaultValue) { if (v != -1) { return v; } else { return defaultValue; } } /** * 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); ArrayList<RawAttribute> rawAttrs = TaskClient.getTaskAttributes(information); BasicAttributes attrs = getAttributes(rawAttrs); return attrs; } 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) { ArrayList<RawAttribute> rawAttrs = new ArrayList<RawAttribute>(); NamingEnumeration<Attribute> nAtt = attrs.getAll(); try { while (nAtt.hasMore()) { Attribute attr = nAtt.next(); NamingEnumeration<?> values = attr.getAll(); ArrayList<ByteString> rawValues = new ArrayList<ByteString>(); while (values.hasMore()) { Object v = values.next(); rawValues.add(ByteString.valueOf(v.toString())); } RawAttribute rAttr = RawAttribute.create(attr.getID(), rawValues); rawAttrs.add(rAttr); } } catch (NamingException ne) { // This is a bug. throw new RuntimeException("Unexpected error: "+ne, ne); } return rawAttrs; } }