001 /*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License"). You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at
010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012 * See the License for the specific language governing permissions
013 * and limitations under the License.
014 *
015 * When distributing Covered Code, include this CDDL HEADER in each
016 * file and include the License file at
017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
018 * add the following below this CDDL HEADER, with the fields enclosed
019 * by brackets "[]" replaced with your own identifying information:
020 * Portions Copyright [yyyy] [name of copyright owner]
021 *
022 * CDDL HEADER END
023 *
024 *
025 * Copyright 2006-2008 Sun Microsystems, Inc.
026 */
027 package org.opends.server.tasks;
028 import org.opends.messages.MessageBuilder;
029
030 import static org.opends.server.config.ConfigConstants.*;
031 import static org.opends.server.core.DirectoryServer.getAttributeType;
032 import static org.opends.server.loggers.debug.DebugLogger.*;
033 import org.opends.server.loggers.debug.DebugTracer;
034
035 import java.util.List;
036
037 import org.opends.server.backends.task.Task;
038 import org.opends.server.backends.task.TaskState;
039 import org.opends.messages.TaskMessages;
040 import org.opends.messages.Message;
041 import org.opends.server.replication.plugin.ReplicationDomain;
042 import org.opends.server.types.Attribute;
043 import org.opends.server.types.AttributeType;
044 import org.opends.server.types.DN;
045 import org.opends.server.types.DirectoryException;
046 import org.opends.server.types.Entry;
047
048
049 import org.opends.server.types.ResultCode;
050
051 /**
052 * This class provides an implementation of a Directory Server task that can
053 * be used to import data from an LDIF file into a backend.
054 */
055 public class InitializeTargetTask extends Task
056 {
057 /**
058 * The tracer object for the debug logger.
059 */
060 private static final DebugTracer TRACER = getTracer();
061
062 // Config properties
063 boolean append = false;
064 boolean isCompressed = false;
065 boolean isEncrypted = false;
066 boolean skipSchemaValidation = false;
067 String domainString = null;
068 ReplicationDomain domain = null;
069 short target;
070 long total;
071 long left;
072
073 /**
074 * {@inheritDoc}
075 */
076 public Message getDisplayName() {
077 return TaskMessages.INFO_TASK_INITIALIZE_TARGET_NAME.get();
078 }
079
080 /**
081 * {@inheritDoc}
082 */
083 @Override public void initializeTask() throws DirectoryException
084 {
085 if (TaskState.isDone(getTaskState()))
086 {
087 return;
088 }
089
090 // FIXME -- Do we need any special authorization here?
091 Entry taskEntry = getTaskEntry();
092
093 AttributeType typeDomainBase;
094 AttributeType typeScope;
095
096 typeDomainBase =
097 getAttributeType(ATTR_TASK_INITIALIZE_TARGET_DOMAIN_DN, true);
098 typeScope =
099 getAttributeType(ATTR_TASK_INITIALIZE_TARGET_SCOPE, true);
100
101 List<Attribute> attrList;
102 attrList = taskEntry.getAttribute(typeDomainBase);
103 domainString = TaskUtils.getSingleValueString(attrList);
104
105 DN domainDN = DN.nullDN();
106 try
107 {
108 domainDN = DN.decode(domainString);
109 }
110 catch(Exception e)
111 {
112 MessageBuilder mb = new MessageBuilder();
113 mb.append(TaskMessages.ERR_TASK_INITIALIZE_INVALID_DN.get());
114 mb.append(e.getLocalizedMessage());
115 throw new DirectoryException(ResultCode.INVALID_DN_SYNTAX,
116 mb.toMessage());
117 }
118 domain=ReplicationDomain.retrievesReplicationDomain(domainDN);
119
120 attrList = taskEntry.getAttribute(typeScope);
121 String targetString = TaskUtils.getSingleValueString(attrList);
122 target = domain.decodeTarget(targetString);
123
124 setTotal(0);
125 }
126
127 /**
128 * {@inheritDoc}
129 */
130 protected TaskState runTask()
131 {
132 if (debugEnabled())
133 {
134 TRACER.debugInfo("DebugInfo" + "InitializeTarget Task/runTask ");
135 }
136 try
137 {
138 domain.initializeRemote(target, this);
139 }
140 catch(DirectoryException de)
141 {
142 // This log will go to the task log message
143 MessageBuilder mb = new MessageBuilder();
144 mb.append("Initialize Task stopped by error");
145 mb.append(de.getMessageObject());
146 logError(mb.toMessage());
147
148 return TaskState.STOPPED_BY_ERROR;
149 }
150 return TaskState.COMPLETED_SUCCESSFULLY;
151 }
152
153 /**
154 * Set the total number of entries expected to be exported.
155 * @param total The total number of entries.
156 * @throws DirectoryException when a problem occurs
157 */
158 public void setTotal(long total) throws DirectoryException
159 {
160 this.total = total;
161 replaceAttributeValue(ATTR_TASK_INITIALIZE_LEFT,
162 String.valueOf(total));
163 replaceAttributeValue(ATTR_TASK_INITIALIZE_DONE, String.valueOf(0));
164 }
165
166 /**
167 * Set the total number of entries still to be exported.
168 * @param left The total number of entries to be exported.
169 * @throws DirectoryException when a problem occurs
170 */
171 public void setLeft(long left) throws DirectoryException
172 {
173 this.left = left;
174 replaceAttributeValue(ATTR_TASK_INITIALIZE_LEFT, String.valueOf(left));
175 replaceAttributeValue(ATTR_TASK_INITIALIZE_DONE,String.valueOf(total-left));
176 }
177 }