001/* 002 * The contents of this file are subject to the terms of the Common Development and 003 * Distribution License (the License). You may not use this file except in compliance with the 004 * License. 005 * 006 * You can obtain a copy of the License at legal/CDDLv1.0.txt. See the License for the 007 * specific language governing permission and limitations under the License. 008 * 009 * When distributing Covered Software, include this CDDL Header Notice in each file and include 010 * the License file at legal/CDDLv1.0.txt. If applicable, add the following below the CDDL 011 * Header, with the fields enclosed by brackets [] replaced by your own identifying 012 * information: "Portions Copyright [year] [name of copyright owner]". 013 * 014 * Copyright 2008-2010 Sun Microsystems, Inc. 015 * Portions Copyright 2014-2016 ForgeRock AS. 016 */ 017package org.opends.guitools.controlpanel.ui; 018 019import static org.opends.messages.AdminToolMessages.*; 020import static org.opends.messages.QuickSetupMessages.*; 021import static com.forgerock.opendj.cli.Utils.OBFUSCATED_VALUE; 022 023import java.awt.Component; 024import java.awt.GridBagConstraints; 025import java.io.File; 026import java.util.ArrayList; 027import java.util.Collection; 028import java.util.HashSet; 029import java.util.LinkedHashSet; 030import java.util.Set; 031import java.util.TreeSet; 032 033import javax.swing.DefaultComboBoxModel; 034import javax.swing.JButton; 035import javax.swing.JCheckBox; 036import javax.swing.JComboBox; 037import javax.swing.JLabel; 038import javax.swing.JTextField; 039import javax.swing.SwingUtilities; 040import javax.swing.event.ChangeEvent; 041import javax.swing.event.ChangeListener; 042import javax.swing.event.DocumentEvent; 043import javax.swing.event.DocumentListener; 044 045import org.opends.admin.ads.util.ConnectionUtils; 046import org.opends.guitools.controlpanel.datamodel.BackendDescriptor; 047import org.opends.guitools.controlpanel.datamodel.BaseDNDescriptor; 048import org.opends.guitools.controlpanel.datamodel.ControlPanelInfo; 049import org.opends.guitools.controlpanel.datamodel.ServerDescriptor; 050import org.opends.guitools.controlpanel.event.BrowseActionListener; 051import org.opends.guitools.controlpanel.event.ConfigurationChangeEvent; 052import org.opends.guitools.controlpanel.task.Task; 053import org.opends.guitools.controlpanel.util.Utilities; 054import org.forgerock.i18n.LocalizableMessage; 055import org.opends.quicksetup.ui.UIFactory; 056import org.opends.quicksetup.util.Utils; 057import org.opends.server.tools.ImportLDIF; 058import org.opends.server.tools.dsreplication.ReplicationCliArgumentParser; 059import org.opends.server.tools.dsreplication.ReplicationCliException; 060import org.opends.server.tools.dsreplication.ReplicationCliMain; 061import org.forgerock.opendj.ldap.DN; 062 063/** 064 * The panel where the user can import the contents of an LDIF file to the 065 * server. 066 */ 067public class ImportLDIFPanel extends InclusionExclusionPanel 068{ 069 private static final long serialVersionUID = 1143246529610229229L; 070 private JComboBox<String> backends; 071 private JTextField file; 072 private JCheckBox dataCompressed; 073 private JCheckBox rejectNotSchemaCompliant; 074 private JCheckBox doDNValidationAfter; 075 private JCheckBox writeRejects; 076 private JCheckBox writeSkips; 077 private JTextField threads; 078 private JTextField rejectsFile; 079 private JTextField skipsFile; 080 private JCheckBox overwriteRejectsFile; 081 private JCheckBox overwriteSkipsFile; 082 private JButton bBrowse; 083 private JButton rejectsBrowse; 084 private JButton skipsBrowse; 085 086 private JLabel lBackend; 087 private JLabel lNoBackendsFound; 088 private JLabel lFile; 089 private JLabel lSchemaValidation; 090 private JLabel lDNValidation; 091 private JLabel lThreads; 092 private JLabel lRejectsFile; 093 private JLabel lSkipsFile; 094 private JLabel lRemoteFileHelp; 095 private JLabel lRemoteRejectsHelp; 096 private JLabel lRemoteSkipsHelp; 097 098 private DocumentListener documentListener; 099 100 /** 101 * Default constructor. 102 * 103 */ 104 public ImportLDIFPanel() 105 { 106 super(); 107 createLayout(); 108 } 109 110 @Override 111 public LocalizableMessage getTitle() 112 { 113 return INFO_CTRL_PANEL_IMPORT_LDIF_TITLE.get(); 114 } 115 116 @Override 117 public Component getPreferredFocusComponent() 118 { 119 return file; 120 } 121 122 @Override 123 public void toBeDisplayed(boolean visible) 124 { 125 if (visible) 126 { 127 documentListener.changedUpdate(null); 128 } 129 } 130 131 /** 132 * Creates the layout of the panel (but the contents are not populated here). 133 */ 134 private void createLayout() 135 { 136 GridBagConstraints gbc = new GridBagConstraints(); 137 gbc.anchor = GridBagConstraints.WEST; 138 gbc.gridx = 0; 139 gbc.gridy = 0; 140 gbc.gridwidth = 3; 141 addErrorPane(gbc); 142 143 gbc.gridy ++; 144 gbc.weightx = 0.0; 145 gbc.gridwidth = 1; 146 gbc.fill = GridBagConstraints.NONE; 147 lBackend = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_BACKEND_LABEL.get()); 148 add(lBackend, gbc); 149 gbc.insets.left = 10; 150 gbc.gridx = 1; 151 backends = Utilities.createComboBox(); 152 backends.setModel(new DefaultComboBoxModel<>(new String[]{})); 153 gbc.gridwidth = 2; 154 add(backends, gbc); 155 lNoBackendsFound = Utilities.createDefaultLabel(INFO_CTRL_PANEL_NO_BACKENDS_FOUND_LABEL.get()); 156 add(lNoBackendsFound, gbc); 157 lNoBackendsFound.setVisible(false); 158 gbc.insets.top = 10; 159 lBackend.setLabelFor(backends); 160 lNoBackendsFound.setLabelFor(lBackend); 161 162 gbc.gridx = 0; 163 gbc.gridy ++; 164 gbc.insets.left = 0; 165 gbc.gridwidth = 1; 166 lFile = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_FILE_TO_IMPORT_LABEL.get()); 167 add(lFile, gbc); 168 169 gbc.gridx = 1; 170 gbc.insets.left = 10; 171 file = Utilities.createTextField(); 172 lFile.setLabelFor(file); 173 documentListener = new DocumentListener() 174 { 175 @Override 176 public void changedUpdate(DocumentEvent ev) 177 { 178 String text = file.getText().trim(); 179 setEnabledOK(text.length() > 0 && !errorPane.isVisible()); 180 } 181 182 @Override 183 public void removeUpdate(DocumentEvent ev) 184 { 185 changedUpdate(ev); 186 } 187 188 @Override 189 public void insertUpdate(DocumentEvent ev) 190 { 191 changedUpdate(ev); 192 } 193 }; 194 file.getDocument().addDocumentListener(documentListener); 195 gbc.weightx = 1.0; 196 gbc.fill = GridBagConstraints.HORIZONTAL; 197 add(file, gbc); 198 bBrowse = Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get()); 199 bBrowse.addActionListener( 200 new BrowseActionListener(file, BrowseActionListener.BrowseType.OPEN_LDIF_FILE, this)); 201 gbc.gridx = 2; 202 gbc.gridwidth = 1; 203 gbc.weightx = 0.0; 204 bBrowse.setOpaque(false); 205 add(bBrowse, gbc); 206 207 lRemoteFileHelp = Utilities.createInlineHelpLabel(INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get()); 208 gbc.gridx = 1; 209 gbc.gridwidth = 2; 210 gbc.insets.top = 3; 211 gbc.insets.left = 10; 212 gbc.gridy ++; 213 add(lRemoteFileHelp, gbc); 214 lRemoteFileHelp.setLabelFor(file); 215 216 gbc.gridx = 1; 217 gbc.gridy ++; 218 gbc.insets.left = 30; 219 gbc.insets.top = 5; 220 gbc.gridwidth = 2; 221 dataCompressed = Utilities.createCheckBox(INFO_CTRL_PANEL_DATA_IN_FILE_COMPRESSED.get()); 222 dataCompressed.setOpaque(false); 223 add(dataCompressed, gbc); 224 225 gbc.gridx = 0; 226 gbc.gridy ++; 227 gbc.insets.left = 0; 228 gbc.insets.top = 10; 229 gbc.gridwidth = 1; 230 lSchemaValidation = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_SCHEMA_VALIDATION_LABEL.get()); 231 add(lSchemaValidation, gbc); 232 233 gbc.gridx = 1; 234 rejectNotSchemaCompliant = Utilities.createCheckBox(INFO_CTRL_PANEL_REJECT_NOT_SCHEMA_COMPLIANT_LABEL.get()); 235 rejectNotSchemaCompliant.setSelected(true); 236 gbc.insets.left = 10; 237 add(rejectNotSchemaCompliant, gbc); 238 lSchemaValidation.setLabelFor(rejectNotSchemaCompliant); 239 240 gbc.gridx = 0; 241 gbc.gridy ++; 242 gbc.insets.left = 0; 243 lDNValidation = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_DN_VALIDATION_LABEL.get()); 244 add(lDNValidation, gbc); 245 246 gbc.gridx = 1; 247 doDNValidationAfter = Utilities.createCheckBox(INFO_CTRL_PANEL_DO_DN_VALIDATION_LATER_LABEL.get()); 248 doDNValidationAfter.setSelected(false); 249 gbc.insets.left = 10; 250 add(doDNValidationAfter, gbc); 251 lDNValidation.setLabelFor(doDNValidationAfter); 252 253 gbc.gridx = 0; 254 gbc.gridy ++; 255 gbc.insets.left = 0; 256 lThreads = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_IMPORT_THREADS_LABEL.get()); 257 add(lThreads, gbc); 258 259 gbc.gridx = 1; 260 threads = Utilities.createShortTextField(); 261 gbc.gridwidth = 2; 262 gbc.fill = GridBagConstraints.NONE; 263 threads.setToolTipText(INFO_CTRL_PANEL_IMPORT_THREADS_TOOLTIP.get().toString()); 264 gbc.insets.left = 10; 265 add(threads, gbc); 266 lThreads.setLabelFor(threads); 267 268 gbc.insets.top = 3; 269 gbc.gridy ++; 270 add(Utilities.createInlineHelpLabel(INFO_CTRL_PANEL_IMPORT_THREADS_HELP.get()), gbc); 271 272 gbc.gridx = 0; 273 gbc.gridy ++; 274 gbc.insets.left = 0; 275 gbc.insets.top = 10; 276 gbc.gridwidth = 1; 277 lRejectsFile = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_REJECTS_FILE_LABEL.get()); 278 add(lRejectsFile, gbc); 279 280 gbc.gridx = 1; 281 writeRejects = Utilities.createCheckBox(INFO_CTRL_PANEL_WRITE_REJECTS_FILE_LABEL.get()); 282 writeRejects.setSelected(false); 283 gbc.insets.left = 10; 284 add(writeRejects, gbc); 285 lRejectsFile.setLabelFor(writeRejects); 286 287 gbc.gridx = 1; 288 gbc.gridy++; 289 gbc.insets.left = 30; 290 gbc.insets.top = 5; 291 rejectsFile = Utilities.createTextField(); 292 gbc.weightx = 1.0; 293 gbc.fill = GridBagConstraints.HORIZONTAL; 294 add(rejectsFile, gbc); 295 rejectsBrowse = Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get()); 296 rejectsBrowse.addActionListener( 297 new BrowseActionListener(rejectsFile, BrowseActionListener.BrowseType.CREATE_GENERIC_FILE, this)); 298 gbc.gridx = 2; 299 gbc.gridwidth = 1; 300 gbc.weightx = 0.0; 301 gbc.insets.left = 10; 302 rejectsBrowse.setOpaque(false); 303 add(rejectsBrowse, gbc); 304 305 lRemoteRejectsHelp = Utilities.createInlineHelpLabel(INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get()); 306 gbc.gridx = 1; 307 gbc.gridwidth = 2; 308 gbc.insets.top = 3; 309 gbc.insets.left = 10; 310 gbc.gridy ++; 311 add(lRemoteRejectsHelp, gbc); 312 313 gbc.gridx = 1; 314 gbc.gridy ++; 315 gbc.insets.left = 30; 316 gbc.gridwidth = 2; 317 overwriteRejectsFile = Utilities.createCheckBox(INFO_CTRL_PANEL_OVERWRITE_REJECTS_FILE_LABEL.get()); 318 overwriteRejectsFile.setOpaque(false); 319 add(overwriteRejectsFile, gbc); 320 lRemoteRejectsHelp.setLabelFor(overwriteRejectsFile); 321 322 ChangeListener changeListener = new ChangeListener() 323 { 324 @Override 325 public void stateChanged(ChangeEvent ev) 326 { 327 rejectsFile.setEnabled(writeRejects.isSelected()); 328 rejectsBrowse.setEnabled(writeRejects.isSelected()); 329 overwriteRejectsFile.setEnabled(writeRejects.isSelected()); 330 } 331 }; 332 writeRejects.addChangeListener(changeListener); 333 writeRejects.setSelected(false); 334 changeListener.stateChanged(null); 335 336 gbc.gridx = 0; 337 gbc.gridy ++; 338 gbc.insets.left = 0; 339 gbc.insets.top = 10; 340 gbc.gridwidth = 1; 341 lSkipsFile = Utilities.createPrimaryLabel(INFO_CTRL_PANEL_SKIPS_FILE_LABEL.get()); 342 add(lSkipsFile, gbc); 343 344 gbc.gridx = 1; 345 writeSkips = Utilities.createCheckBox(INFO_CTRL_PANEL_WRITE_SKIPS_FILE_LABEL.get()); 346 writeSkips.setSelected(false); 347 gbc.insets.left = 10; 348 add(writeSkips, gbc); 349 lSkipsFile.setLabelFor(writeSkips); 350 351 gbc.gridx = 1; 352 gbc.gridy++; 353 gbc.insets.left = 30; 354 gbc.insets.top = 5; 355 skipsFile = Utilities.createTextField(); 356 gbc.weightx = 1.0; 357 gbc.fill = GridBagConstraints.HORIZONTAL; 358 add(skipsFile, gbc); 359 skipsBrowse = Utilities.createButton(INFO_CTRL_PANEL_BROWSE_BUTTON_LABEL.get()); 360 skipsBrowse.addActionListener( 361 new BrowseActionListener(skipsFile, BrowseActionListener.BrowseType.CREATE_GENERIC_FILE, this)); 362 gbc.gridx = 2; 363 gbc.gridwidth = 1; 364 gbc.weightx = 0.0; 365 gbc.insets.left = 10; 366 skipsBrowse.setOpaque(false); 367 add(skipsBrowse, gbc); 368 369 lRemoteSkipsHelp = Utilities.createInlineHelpLabel(INFO_CTRL_PANEL_REMOTE_SERVER_PATH.get()); 370 gbc.gridx = 1; 371 gbc.gridwidth = 2; 372 gbc.insets.top = 3; 373 gbc.insets.left = 10; 374 gbc.gridy ++; 375 add(lRemoteSkipsHelp, gbc); 376 377 gbc.gridx = 1; 378 gbc.gridy ++; 379 gbc.insets.left = 30; 380 gbc.gridwidth = 2; 381 overwriteSkipsFile = Utilities.createCheckBox(INFO_CTRL_PANEL_OVERWRITE_SKIPS_FILE_LABEL.get()); 382 overwriteSkipsFile.setOpaque(false); 383 add(overwriteSkipsFile, gbc); 384 lRemoteSkipsHelp.setLabelFor(overwriteSkipsFile); 385 386 changeListener = new ChangeListener() 387 { 388 @Override 389 public void stateChanged(ChangeEvent ev) 390 { 391 skipsFile.setEnabled(writeSkips.isSelected()); 392 skipsBrowse.setEnabled(writeSkips.isSelected()); 393 overwriteSkipsFile.setEnabled(writeSkips.isSelected()); 394 } 395 }; 396 writeSkips.addChangeListener(changeListener); 397 writeSkips.setSelected(false); 398 changeListener.stateChanged(null); 399 400 changeListener = new ChangeListener() 401 { 402 @Override 403 public void stateChanged(ChangeEvent ev) 404 { 405 if (ev.getSource() == overwriteSkipsFile) 406 { 407 overwriteRejectsFile.setSelected(overwriteSkipsFile.isSelected()); 408 } 409 if (ev.getSource() == overwriteRejectsFile) 410 { 411 overwriteSkipsFile.setSelected(overwriteRejectsFile.isSelected()); 412 } 413 } 414 }; 415 overwriteRejectsFile.addChangeListener(changeListener); 416 overwriteSkipsFile.addChangeListener(changeListener); 417 418 gbc.insets.top = 10; 419 gbc.insets.left = 0; 420 gbc.gridy ++; 421 gbc.gridx = 0; 422 gbc.gridwidth = 3; 423 gbc.fill = GridBagConstraints.HORIZONTAL; 424 add(createDataExclusionOptions(new JLabel[]{}, new Component[]{}), gbc); 425 gbc.gridy ++; 426 gbc.insets.top = 15; 427 add(createDataInclusionOptions(new JLabel[]{}, new Component[]{}), gbc); 428 429 addBottomGlue(gbc); 430 } 431 432 @Override 433 public void configurationChanged(ConfigurationChangeEvent ev) 434 { 435 ServerDescriptor desc = ev.getNewDescriptor(); 436 updateSimpleBackendComboBoxModel(backends, lNoBackendsFound, desc); 437 updateErrorPaneAndOKButtonIfAuthRequired(desc, 438 isLocal() ? INFO_CTRL_PANEL_AUTHENTICATION_REQUIRED_FOR_IMPORT.get() : 439 INFO_CTRL_PANEL_CANNOT_CONNECT_TO_REMOTE_DETAILS.get(desc.getHostname())); 440 SwingUtilities.invokeLater(new Runnable() 441 { 442 @Override 443 public void run() 444 { 445 lRemoteFileHelp.setVisible(!isLocal()); 446 bBrowse.setVisible(isLocal()); 447 rejectsBrowse.setVisible(isLocal()); 448 skipsBrowse.setVisible(isLocal()); 449 lRemoteRejectsHelp.setVisible(!isLocal()); 450 lRemoteSkipsHelp.setVisible(!isLocal()); 451 } 452 }); 453 } 454 455 @Override 456 protected void checkOKButtonEnable() 457 { 458 documentListener.changedUpdate(null); 459 } 460 461 @Override 462 public void okClicked() 463 { 464 setPrimaryValid(lBackend); 465 setPrimaryValid(lFile); 466 setPrimaryValid(lRejectsFile); 467 setPrimaryValid(lSkipsFile); 468 setPrimaryValid(lThreads); 469 final LinkedHashSet<LocalizableMessage> errors = new LinkedHashSet<>(); 470 471 String backendName = (String)backends.getSelectedItem(); 472 if (backendName == null) 473 { 474 errors.add(ERR_CTRL_PANEL_NO_BACKEND_SELECTED.get()); 475 setPrimaryInvalid(lBackend); 476 } 477 478 String ldifPath = file.getText(); 479 if (ldifPath == null || "".equals(ldifPath.trim())) 480 { 481 errors.add(INFO_NO_LDIF_PATH.get()); 482 setPrimaryInvalid(lFile); 483 } else if (isLocal() && !Utils.fileExists(ldifPath)) 484 { 485 errors.add(INFO_LDIF_FILE_DOES_NOT_EXIST.get()); 486 setPrimaryInvalid(lFile); 487 } 488 489 String sThread = threads.getText().trim(); 490 if (sThread.length() > 0) 491 { 492 try 493 { 494 int threads = Integer.parseInt(sThread); 495 if (threads < 1) 496 { 497 errors.add(ERR_IMPORT_THREAD_NUMBER_INVALID.get()); 498 setPrimaryInvalid(lThreads); 499 } 500 } 501 catch (Throwable t) 502 { 503 errors.add(ERR_IMPORT_THREAD_NUMBER_INVALID.get()); 504 setPrimaryInvalid(lThreads); 505 } 506 } 507 508 if (writeRejects.isSelected()) 509 { 510 String rejectPath = rejectsFile.getText(); 511 if (rejectPath == null || "".equals(rejectPath.trim())) 512 { 513 errors.add(ERR_CTRL_PANEL_REJECTS_FILE_REQUIRED.get()); 514 setPrimaryInvalid(lRejectsFile); 515 } 516 else if (writeSkips.isSelected() && new File(rejectPath).equals(new File(skipsFile.getText()))) 517 { 518 errors.add(ERR_CTRL_PANEL_REJECTS_AND_SKIPS_MUST_BE_DIFFERENT.get()); 519 setPrimaryInvalid(lRejectsFile); 520 setPrimaryInvalid(lSkipsFile); 521 } 522 } 523 524 if (writeSkips.isSelected()) 525 { 526 String skipPath = skipsFile.getText(); 527 if (skipPath == null || "".equals(skipPath.trim())) 528 { 529 errors.add(ERR_CTRL_PANEL_SKIPS_FILE_REQUIRED.get()); 530 setPrimaryInvalid(lSkipsFile); 531 } 532 } 533 534 updateIncludeExclude(errors, backendName); 535 536 if (errors.isEmpty()) 537 { 538 ProgressDialog progressDialog = new ProgressDialog( 539 Utilities.createFrame(), 540 Utilities.getParentDialog(this), getTitle(), getInfo()); 541 ImportTask newTask = new ImportTask(getInfo(), progressDialog); 542 for (Task task : getInfo().getTasks()) 543 { 544 task.canLaunch(newTask, errors); 545 } 546 boolean initializeAll = false; 547 if (errors.isEmpty()) 548 { 549 Set<DN> replicatedBaseDNs = getReplicatedBaseDNs(); 550 boolean canInitialize = !replicatedBaseDNs.isEmpty() && isServerRunning(); 551 if (canInitialize) 552 { 553 ArrayList<String> dns = new ArrayList<>(); 554 for (DN dn : replicatedBaseDNs) 555 { 556 dns.add(dn.toString()); 557 } 558 initializeAll = displayConfirmationDialog( 559 INFO_CTRL_PANEL_CONFIRMATION_REQUIRED_SUMMARY.get(), 560 INFO_CTRL_PANEL_CONFIRMATION_INITIALIZE_ALL_DETAILS.get(Utilities.getStringFromCollection(dns, "<br>"))); 561 } 562 563 newTask.setInitializeAll(initializeAll); 564 launchOperation(newTask, 565 INFO_CTRL_PANEL_IMPORTING_LDIF_SUMMARY.get(backends.getSelectedItem()), 566 INFO_CTRL_PANEL_IMPORTING_LDIF_SUCCESSFUL_SUMMARY.get(), 567 INFO_CTRL_PANEL_IMPORTING_LDIF_SUCCESSFUL_DETAILS.get(), 568 ERR_CTRL_PANEL_IMPORTING_LDIF_ERROR_SUMMARY.get(), 569 null, 570 ERR_CTRL_PANEL_IMPORTING_LDIF_ERROR_DETAILS, 571 progressDialog); 572 progressDialog.setVisible(true); 573 Utilities.getParentDialog(this).setVisible(false); 574 } 575 } 576 if (!errors.isEmpty()) 577 { 578 displayErrorDialog(errors); 579 } 580 } 581 582 @Override 583 public void cancelClicked() 584 { 585 setPrimaryValid(lBackend); 586 setPrimaryValid(lFile); 587 setPrimaryValid(lSchemaValidation); 588 setPrimaryValid(lDNValidation); 589 setPrimaryValid(lThreads); 590 setPrimaryValid(lRejectsFile); 591 setPrimaryValid(lSkipsFile); 592 super.cancelClicked(); 593 } 594 595 private Set<DN> getReplicatedBaseDNs() 596 { 597 Set<DN> baseDNs = new TreeSet<>(); 598 String backendID = (String)backends.getSelectedItem(); 599 if (backendID != null) 600 { 601 for (BackendDescriptor backend : 602 getInfo().getServerDescriptor().getBackends()) 603 { 604 if (backendID.equalsIgnoreCase(backend.getBackendID())) 605 { 606 for (BaseDNDescriptor baseDN : backend.getBaseDns()) 607 { 608 if (baseDN.getReplicaID() != -1) 609 { 610 baseDNs.add(baseDN.getDn()); 611 } 612 } 613 } 614 } 615 } 616 return baseDNs; 617 } 618 619 /** 620 * The class that performs the import. 621 * 622 */ 623 protected class ImportTask extends InclusionExclusionTask 624 { 625 private Set<String> backendSet; 626 private String fileName; 627 private boolean initializeAll; 628 private Set<DN> replicatedBaseDNs; 629 630 /** 631 * The constructor of the task. 632 * @param info the control panel info. 633 * @param dlg the progress dialog that shows the progress of the task. 634 */ 635 public ImportTask(ControlPanelInfo info, ProgressDialog dlg) 636 { 637 super(info, dlg); 638 backendSet = new HashSet<>(); 639 backendSet.add((String)backends.getSelectedItem()); 640 fileName = file.getText(); 641 replicatedBaseDNs = getReplicatedBaseDNs(); 642 } 643 644 private void setInitializeAll(boolean initializeAll) 645 { 646 this.initializeAll = initializeAll; 647 } 648 649 @Override 650 public Type getType() 651 { 652 return Type.IMPORT_LDIF; 653 } 654 655 @Override 656 public LocalizableMessage getTaskDescription() 657 { 658 return INFO_CTRL_PANEL_IMPORT_TASK_DESCRIPTION.get(fileName, backendSet.iterator().next()); 659 } 660 661 @Override 662 public boolean canLaunch(Task taskToBeLaunched, Collection<LocalizableMessage> incompatibilityReasons) 663 { 664 boolean canLaunch = true; 665 if (state == State.RUNNING && runningOnSameServer(taskToBeLaunched)) 666 { 667 // All the operations are incompatible if they apply to this backend. 668 Set<String> backends = new TreeSet<>(taskToBeLaunched.getBackends()); 669 backends.retainAll(getBackends()); 670 if (!backends.isEmpty()) 671 { 672 incompatibilityReasons.add(getIncompatibilityMessage(this, taskToBeLaunched)); 673 canLaunch = false; 674 } 675 } 676 return canLaunch; 677 } 678 679 @Override 680 protected ArrayList<String> getCommandLineArguments() 681 { 682 ArrayList<String> args = new ArrayList<>(); 683 args.add("--ldifFile"); 684 args.add(fileName); 685 args.add("--backendID"); 686 args.add((String)backends.getSelectedItem()); 687 if (dataCompressed.isSelected()) 688 { 689 args.add("--isCompressed"); 690 } 691 if (!rejectNotSchemaCompliant.isSelected()) 692 { 693 args.add("--skipSchemaValidation"); 694 } 695 if (doDNValidationAfter.isSelected()) 696 { 697 args.add("--skipDNValidation"); 698 } 699 700 String sThread = threads.getText().trim(); 701 if (sThread.length() > 0) 702 { 703 args.add("--threadCount"); 704 args.add(sThread); 705 } 706 707 if (writeRejects.isSelected()) 708 { 709 args.add("--rejectFile"); 710 args.add(rejectsFile.getText()); 711 } 712 713 if (writeSkips.isSelected()) 714 { 715 args.add("--skipFile"); 716 args.add(skipsFile.getText()); 717 } 718 719 if ((writeRejects.isSelected() || writeSkips.isSelected()) && overwriteRejectsFile.isSelected()) 720 { 721 args.add("--overwrite"); 722 } 723 724 args.addAll(super.getCommandLineArguments()); 725 726 if (isServerRunning()) 727 { 728 args.addAll(getConfigCommandLineArguments()); 729 } 730 731 args.add(getNoPropertiesFileArgument()); 732 733 return args; 734 } 735 736 @Override 737 protected String getCommandLinePath() 738 { 739 return getCommandLinePath("import-ldif"); 740 } 741 742 @Override 743 public void runTask() 744 { 745 state = State.RUNNING; 746 lastException = null; 747 try 748 { 749 ArrayList<String> arguments = getCommandLineArguments(); 750 751 String[] args = new String[arguments.size()]; 752 753 arguments.toArray(args); 754 if (isServerRunning()) 755 { 756 returnCode = ImportLDIF.mainImportLDIF(args, false, outPrintStream, errorPrintStream); 757 if (returnCode == 0 && initializeAll) 758 { 759 initializeAll(); 760 } 761 } 762 else 763 { 764 returnCode = executeCommandLine(getCommandLinePath(), args); 765 } 766 if (returnCode != 0) 767 { 768 state = State.FINISHED_WITH_ERROR; 769 } 770 else 771 { 772 for (String backend : getBackends()) 773 { 774 getInfo().unregisterModifiedIndexesInBackend(backend); 775 } 776 state = State.FINISHED_SUCCESSFULLY; 777 } 778 } 779 catch (Throwable t) 780 { 781 lastException = t; 782 state = State.FINISHED_WITH_ERROR; 783 } 784 HashSet<BackendDescriptor> backends = new HashSet<>(); 785 for (BackendDescriptor backend : getInfo().getServerDescriptor().getBackends()) 786 { 787 for (String backendID : getBackends()) 788 { 789 if (backendID.equalsIgnoreCase(backend.getBackendID())) 790 { 791 backends.add(backend); 792 break; 793 } 794 } 795 } 796 if (!backends.isEmpty()) 797 { 798 getInfo().backendPopulated(backends); 799 } 800 } 801 802 @Override 803 public Set<String> getBackends() 804 { 805 return backendSet; 806 } 807 808 private void initializeAll() throws ReplicationCliException 809 { 810 ReplicationCliMain repl = new ReplicationCliMain(outPrintStream, errorPrintStream); 811 getProgressDialog().appendProgressHtml(UIFactory.HTML_SEPARATOR+"<br><br>"); 812 813 String cmd = getCommandLineToInitializeAll(); 814 815 getProgressDialog().appendProgressHtml(Utilities.applyFont( 816 INFO_CTRL_PANEL_EQUIVALENT_CMD_TO_INITIALIZE_ALL.get()+ "<br><b>"+cmd+"</b><br><br>", 817 ColorAndFontConstants.progressFont)); 818 819 for (DN baseDN : replicatedBaseDNs) 820 { 821 LocalizableMessage msg = INFO_PROGRESS_INITIALIZING_SUFFIX.get(baseDN, 822 ConnectionUtils.getHostPort(getInfo().getDirContext())); 823 getProgressDialog().appendProgressHtml(Utilities.applyFont(msg + "<br>", ColorAndFontConstants.progressFont)); 824 repl.initializeAllSuffix(baseDN.toString(), getInfo().getDirContext(), true); 825 } 826 } 827 828 private String getCommandLineToInitializeAll() 829 { 830 String cmdLineName = getCommandLinePath("dsreplication"); 831 ArrayList<String> args = new ArrayList<>(); 832 args.add(ReplicationCliArgumentParser.INITIALIZE_ALL_REPLICATION_SUBCMD_NAME); 833 args.add("--hostName"); 834 args.add(getInfo().getServerDescriptor().getHostname()); 835 args.add("--port"); 836 args.add(String.valueOf(ConnectionUtils.getPort(getInfo().getDirContext()))); 837 for (DN baseDN : replicatedBaseDNs) 838 { 839 args.add("--baseDN"); 840 args.add(baseDN.toString()); 841 } 842 args.add("--adminUID"); 843 args.add("admin"); 844 args.add("--adminPassword"); 845 args.add(OBFUSCATED_VALUE); 846 args.add("--trustAll"); 847 args.add("--no-prompt"); 848 849 return Task.getEquivalentCommandLine(cmdLineName, args); 850 } 851 } 852}