1
/** BEGIN COPYRIGHT BLOCK
2
* Copyright (C) 2001 Sun Microsystems, Inc. Used by permission.
3
* Copyright (C) 2005 Red Hat, Inc.
6
* This program is free software; you can redistribute it and/or modify
7
* it under the terms of the GNU General Public License as published by
8
* the Free Software Foundation version 2 of the License.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
* END COPYRIGHT BLOCK **/
20
package com.netscape.admin.dirserv.panel.replication;
25
import java.awt.event.*;
27
import javax.swing.event.*;
28
import com.netscape.admin.dirserv.*;
29
import com.netscape.admin.dirserv.logging.DSLogViewerModel;
30
import com.netscape.admin.dirserv.panel.*;
31
import com.netscape.management.client.*;
32
import com.netscape.management.client.console.*;
33
import com.netscape.management.client.util.*;
34
import netscape.ldap.*;
38
* Information Panel for Replication Agreement
43
* @see com.netscape.admin.dirserv.panel.replication
45
public class AgreementInfoPanel extends ReplicationBlankPanel
46
implements ITabPanel, DocumentListener {
48
/*==========================================================
50
*==========================================================*/
54
* construction is delayed until selected.
55
* @param owner resource object owner
57
AgreementInfoPanel(IAgreementPanel parent, int index) {
59
setTitle(_resource.getString("replication-info-tab","label"));
60
if(_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD)
62
_helpToken = "configuration-sync-summary-help";
64
_helpToken = "configuration-replication-summary-help";
66
_refreshWhenSelect = false;
69
/*==========================================================
71
*==========================================================*/
74
int space = UIFactory.getComponentSpace();
75
GridBagLayout gb = new GridBagLayout();
76
GridBagConstraints gbc = new GridBagConstraints();
77
ReplicationTool.resetGBC(gbc);
78
_myPanel.setLayout(gb);
79
_myPanel.setBackground(getBackground());
81
//======== Top Panel ===========================
82
JPanel top = new JPanel();
83
GridBagLayout gb1 = new GridBagLayout();
85
top.setBackground(getBackground());
86
ReplicationTool.resetGBC(gbc);
87
gbc.anchor = gbc.NORTH;
88
gbc.gridwidth = gbc.REMAINDER;
90
gb.setConstraints(top, gbc);
96
if (_agreement.getAgreementType() ==
97
ReplicationAgreement.AGREEMENT_TYPE_MMR) {
98
img = ReplicationTool.getImage(_resource.getString(
99
"replication-info","mmrIcon"));
100
description = _resource.getString("replication-info","mmrDesc");
101
} else if (_agreement.getAgreementType() ==
102
ReplicationAgreement.AGREEMENT_TYPE_AD) {
103
img = ReplicationTool.getImage(_resource.getString(
104
"replication-info","mmrIcon"));
105
description = "This is an Active Directory agreement";
107
img = ReplicationTool.getImage(_resource.getString(
108
"replication-info","legacyrIcon"));
109
description = _resource.getString("replication-info","legacyrDesc");
112
JLabel iconLabel = makeJLabel(img);
113
ReplicationTool.resetGBC(gbc);
115
gbc.insets = ReplicationTool.DEFAULT_EMPTY_INSETS;
116
gb1.setConstraints(iconLabel, gbc);
119
JPanel titlePanel = new JPanel();
120
GridBagLayout gb1a = new GridBagLayout();
121
titlePanel.setLayout(gb1a);
122
titlePanel.setBackground(getBackground());
123
ReplicationTool.resetGBC(gbc);
125
gbc.gridwidth = gbc.REMAINDER;
126
gb1.setConstraints(titlePanel, gbc);
129
JLabel label = makeJLabel(description);
130
label.setLabelFor(this);
131
ReplicationTool.resetGBC(gbc);
132
gbc.gridwidth = gbc.REMAINDER;
133
gbc.gridheight = gbc.REMAINDER;
134
gbc.insets = ReplicationTool.DEFAULT_EMPTY_INSETS;
136
gb1a.setConstraints(label, gbc);
137
titlePanel.add(label);
140
JLabel name = makeJLabel(_resource.getString(
141
"replication-destination-description","label"));
142
ReplicationTool.resetGBC(gbc);
143
gbc.anchor = gbc.EAST;
145
gbc.insets = new Insets(10,space,0,space);
146
gb1.setConstraints(name, gbc);
149
_nameTextField= makeJTextField("");
150
name.setLabelFor(_nameTextField);
151
//_nameTextField.getDocument().addDocumentListener(this);
152
_activeColor = name.getBackground();
153
ReplicationTool.resetGBC(gbc);
154
gbc.gridwidth = gbc.REMAINDER;
156
gbc.insets = new Insets(10,space,0,10);
157
gb1.setConstraints(_nameTextField, gbc);
158
top.add(_nameTextField);
161
// create DSEntry associated with name to ensure
162
// proper coloring and button enabling
163
entries = getDSEntrySet();
164
_nameDSEntry = new DSEntryTextStrict (_agreement.getDescription(), _nameTextField, name);
165
setComponentTable(_nameTextField, _nameDSEntry);
166
entries.add( _agreement.getEntryDN(), ATTR_DESCRIPTION, _nameDSEntry );
169
//========= summary panel =======================
170
String title = _resource.getString("replication-info-summary","label");
171
JPanel summary = new GroupPanel(title);
172
GridBagLayout gb2 = new GridBagLayout();
173
summary.setLayout(gb2);
174
ReplicationTool.resetGBC(gbc);
175
gbc.gridwidth = gbc.REMAINDER;
177
gb.setConstraints(summary, gbc);
178
_myPanel.add(summary);
182
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
183
from = makeJLabel(_resource.getString(
184
"sync-info-summary-from","label"));
186
from = makeJLabel(_resource.getString(
187
"replication-info-summary-from","label"));
189
from.setToolTipText(_resource.getString(
190
"replication-info-summary-from","ttip"));
191
ReplicationTool.resetGBC(gbc);
192
gbc.anchor = gbc.EAST;
194
gb2.setConstraints(from, gbc);
197
_fromText = makeJLabel("");
198
from.setLabelFor(_fromText);
199
ReplicationTool.resetGBC(gbc);
200
gbc.gridwidth = gbc.REMAINDER;
201
gbc.anchor = gbc.WEST;
203
gb2.setConstraints(_fromText, gbc);
204
summary.add(_fromText);
208
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
209
to = makeJLabel(_resource.getString(
210
"sync-info-summary-to","label"));
212
to = makeJLabel(_resource.getString(
213
"replication-info-summary-to","label"));
215
to.setToolTipText(_resource.getString(
216
"replication-info-summary-to","ttip"));
217
ReplicationTool.resetGBC(gbc);
218
gbc.anchor = gbc.EAST;
220
gb2.setConstraints(to, gbc);
223
_toText = makeJLabel("");
224
to.setLabelFor(_toText);
225
ReplicationTool.resetGBC(gbc);
226
gbc.gridwidth = gbc.REMAINDER;
227
gbc.anchor = gbc.WEST;
228
gb2.setConstraints(_toText, gbc);
229
summary.add(_toText);
231
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
233
JLabel dsRepSubtree = makeJLabel(_resource.getString("replication-info-summary-ds-subtree","label")); //XXX
234
dsRepSubtree.setToolTipText(_resource.getString(
235
"replication-info-summary-ds-subtree","ttip"));
236
ReplicationTool.resetGBC(gbc);
237
gbc.anchor = gbc.EAST;
239
// gbc.insets = new Insets(space,space,10,space);
240
gb2.setConstraints(dsRepSubtree, gbc);
241
summary.add(dsRepSubtree);
243
_dsRepSubtreeText = makeJLabel();
244
dsRepSubtree.setLabelFor(_dsRepSubtreeText);
245
ReplicationTool.resetGBC(gbc);
246
gbc.gridwidth = gbc.REMAINDER;
247
// gbc.insets = new Insets(space,space,10,space);
248
gbc.anchor = gbc.EAST;
249
gb2.setConstraints(_dsRepSubtreeText, gbc);
250
summary.add(_dsRepSubtreeText);
253
JLabel winRepSubtree = makeJLabel(_resource.getString("replication-info-summary-win-subtree","label")); //XXX
254
winRepSubtree.setToolTipText(_resource.getString(
255
"replication-info-summary-win-subtree","ttip"));
256
ReplicationTool.resetGBC(gbc);
257
gbc.anchor = gbc.EAST;
259
// gbc.insets = new Insets(space,space,10,space);
260
gb2.setConstraints(winRepSubtree, gbc);
261
summary.add(winRepSubtree);
263
_winRepSubtreeText = makeJLabel();
264
winRepSubtree.setLabelFor(_winRepSubtreeText);
265
ReplicationTool.resetGBC(gbc);
266
gbc.gridwidth = gbc.REMAINDER;
267
// gbc.insets = new Insets(space,space,10,space);
268
gbc.anchor = gbc.EAST;
269
gb2.setConstraints(_winRepSubtreeText, gbc);
270
summary.add(_winRepSubtreeText);
274
JLabel suffix = makeJLabel(_resource.getString(
275
"replication-info-summary-subtree","label"));
276
suffix.setToolTipText(_resource.getString(
277
"replication-info-summary-subtree","ttip"));
278
ReplicationTool.resetGBC(gbc);
279
gbc.anchor = gbc.EAST;
281
gbc.insets = new Insets(space,space,10,space);
282
gb2.setConstraints(suffix, gbc);
285
_suffixText = makeJLabel();
286
suffix.setLabelFor(_suffixText);
287
ReplicationTool.resetGBC(gbc);
288
gbc.gridwidth = gbc.REMAINDER;
289
gbc.insets = new Insets(space,space,10,space);
290
gbc.anchor = gbc.WEST;
291
gb2.setConstraints(_suffixText, gbc);
292
summary.add(_suffixText);
296
//========== status panel ======================
297
title = _resource.getString("replication-info-status","label");
298
JPanel status = new GroupPanel(title);
299
GridBagLayout gb3 = new GridBagLayout();
300
status.setLayout(gb3);
301
ReplicationTool.resetGBC(gbc);
302
gbc.anchor = gbc.NORTH;
303
gbc.gridwidth = gbc.REMAINDER;
305
gbc.fill = gbc.HORIZONTAL;
307
gb.setConstraints(status, gbc);
308
_myPanel.add(status);
310
//update in progress?
311
JLabel lInProgress = makeJLabel(_resource.getString(
312
"replication-info-status-inProgress","label"));
313
ReplicationTool.resetGBC(gbc);
314
gbc.anchor = gbc.EAST;
316
gbc.insets = new Insets(space,space,0,space);
317
gb3.setConstraints(lInProgress, gbc);
318
status.add(lInProgress);
320
_valInProgress = makeJLabel("");
321
lInProgress.setLabelFor(_valInProgress);
322
ReplicationTool.resetGBC(gbc);
323
gbc.anchor = gbc.WEST;
324
gbc.gridwidth = gbc.REMAINDER;
326
gbc.insets = new Insets(space,space,0,space);
327
gb3.setConstraints(_valInProgress, gbc);
328
status.add(_valInProgress);
331
JLabel lastUpdate = makeJLabel(_resource.getString(
332
"replication-info-status-lastUpdate","label"));
333
ReplicationTool.resetGBC(gbc);
334
gbc.anchor = gbc.EAST;
336
gbc.insets = new Insets(space,space,0,space);
337
gb3.setConstraints(lastUpdate, gbc);
338
status.add(lastUpdate);
340
_lastUpdateText = makeJLabel("");
341
lastUpdate.setLabelFor(_lastUpdateText);
342
ReplicationTool.resetGBC(gbc);
343
gbc.anchor = gbc.WEST;
344
gbc.gridwidth = gbc.REMAINDER;
346
gbc.insets = new Insets(space,space,0,space);
347
gb3.setConstraints(_lastUpdateText, gbc);
348
status.add(_lastUpdateText);
350
//n changes sent last update
351
JLabel lNChangesLast = makeJLabel(_resource.getString(
352
"replication-info-status-nChangesLast","label"));
353
ReplicationTool.resetGBC(gbc);
354
gbc.anchor = gbc.EAST;
356
gbc.insets = new Insets(space,space,0,space);
357
gb3.setConstraints(lNChangesLast, gbc);
358
status.add(lNChangesLast);
360
_valNChangesLast = makeJLabel("");
361
lNChangesLast.setLabelFor(_valNChangesLast);
362
ReplicationTool.resetGBC(gbc);
363
gbc.gridwidth = gbc.REMAINDER;
364
gbc.anchor = gbc.WEST;
365
gbc.insets = new Insets(space,space,0,space);
366
gb3.setConstraints(_valNChangesLast, gbc);
367
status.add(_valNChangesLast);
369
//last update begin time
370
JLabel lLastUpdateBegin = makeJLabel(_resource.getString(
371
"replication-info-status-lastUpdateBegin","label"));
372
ReplicationTool.resetGBC(gbc);
373
gbc.anchor = gbc.EAST;
375
gbc.insets = new Insets(space,space,0,space);
376
gb3.setConstraints(lLastUpdateBegin, gbc);
377
status.add(lLastUpdateBegin);
379
_valLastUpdateBegin = makeJLabel("");
380
lLastUpdateBegin.setLabelFor(_valLastUpdateBegin);
381
ReplicationTool.resetGBC(gbc);
382
gbc.gridwidth = gbc.REMAINDER;
383
gbc.anchor = gbc.WEST;
384
gbc.insets = new Insets(space,space,0,space);
385
gb3.setConstraints(_valLastUpdateBegin, gbc);
386
status.add(_valLastUpdateBegin);
388
//last update end time
389
JLabel lLastUpdateEnd = makeJLabel(_resource.getString(
390
"replication-info-status-lastUpdateEnd","label"));
391
ReplicationTool.resetGBC(gbc);
392
gbc.anchor = gbc.EAST;
394
gbc.insets = new Insets(space,space,0,space);
395
gbc.insets.bottom = ReplicationTool.BOTTOM_INSETS.bottom;
396
gb3.setConstraints(lLastUpdateEnd, gbc);
397
status.add(lLastUpdateEnd);
399
_valLastUpdateEnd = makeJLabel("");
400
lLastUpdateEnd.setLabelFor(_valLastUpdateEnd);
401
ReplicationTool.resetGBC(gbc);
402
gbc.gridwidth = gbc.REMAINDER;
403
gbc.anchor = gbc.WEST;
404
gbc.insets = new Insets(space,space,0,space);
405
gbc.insets.bottom = ReplicationTool.BOTTOM_INSETS.bottom;
406
gb3.setConstraints(_valLastUpdateEnd, gbc);
407
status.add(_valLastUpdateEnd);
411
//========== Consumer init status panel ======================
412
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
413
title = _resource.getString("sync-info-fullsync-status","label");
415
title = _resource.getString("replication-info-initconsumer-status","label");
417
_consumerInitPanel = new GroupPanel(title);
418
GridBagLayout gb4 = new GridBagLayout();
419
_consumerInitPanel.setLayout(gb4);
420
ReplicationTool.resetGBC(gbc);
421
gbc.anchor = gbc.NORTH;
422
gbc.gridwidth = gbc.REMAINDER;
423
gbc.gridheight = gbc.REMAINDER;
425
gbc.fill = gbc.HORIZONTAL;
427
gb.setConstraints(_consumerInitPanel, gbc);
428
_myPanel.add(_consumerInitPanel);
431
gbc.fill = gbc.VERTICAL;
432
_myPanel.add(Box.createVerticalGlue(), gbc);
434
//consumer initialization in progress?
435
JLabel lConsumerInitializationInProgress;
436
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
437
lConsumerInitializationInProgress = makeJLabel(_resource.getString(
438
"sync-info-fullsync-status-inProgress","label"));
440
lConsumerInitializationInProgress = makeJLabel(_resource.getString(
441
"replication-info-initconsumer-status-inProgress","label"));
443
ReplicationTool.resetGBC(gbc);
444
gbc.anchor = gbc.EAST;
446
gbc.insets = new Insets(space,space,0,space);
447
gb4.setConstraints(lConsumerInitializationInProgress, gbc);
448
_consumerInitPanel.add(lConsumerInitializationInProgress);
450
_valConsumerInitializationInProgress = makeJLabel("");
451
lConsumerInitializationInProgress.setLabelFor(_valConsumerInitializationInProgress);
452
ReplicationTool.resetGBC(gbc);
453
gbc.anchor = gbc.WEST;
454
gbc.gridwidth = gbc.REMAINDER;
456
gbc.insets = new Insets(space,space,0,space);
457
gb4.setConstraints(_valConsumerInitializationInProgress, gbc);
458
_consumerInitPanel.add(_valConsumerInitializationInProgress);
460
//last Consumer Initialization Status
461
JLabel consumerInitializationStatus;
462
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
463
consumerInitializationStatus = makeJLabel(_resource.getString(
464
"sync-info-fullsync-status-lastUpdate","label"));
466
consumerInitializationStatus = makeJLabel(_resource.getString(
467
"replication-info-initconsumer-status-lastUpdate","label"));
469
ReplicationTool.resetGBC(gbc);
470
gbc.anchor = gbc.EAST;
472
gbc.insets = new Insets(space,space,0,space);
473
gb4.setConstraints(consumerInitializationStatus, gbc);
474
_consumerInitPanel.add(consumerInitializationStatus);
476
_consumerInitializationStatus = makeJLabel("");
477
consumerInitializationStatus.setLabelFor(_consumerInitializationStatus);
478
ReplicationTool.resetGBC(gbc);
479
gbc.anchor = gbc.WEST;
480
gbc.gridwidth = gbc.REMAINDER;
482
gbc.insets = new Insets(space,space,0,space);
483
gb4.setConstraints(_consumerInitializationStatus, gbc);
484
_consumerInitPanel.add(_consumerInitializationStatus);
486
//last consumer initialization begin time
487
JLabel lConsumerInitializationBegin;
488
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
489
lConsumerInitializationBegin = makeJLabel(_resource.getString(
490
"sync-info-fullsync-status-begin","label"));
492
lConsumerInitializationBegin = makeJLabel(_resource.getString(
493
"replication-info-initconsumer-status-begin","label"));
495
ReplicationTool.resetGBC(gbc);
496
gbc.anchor = gbc.EAST;
498
gbc.insets = new Insets(space,space,0,space);
499
gb4.setConstraints(lConsumerInitializationBegin, gbc);
500
_consumerInitPanel.add(lConsumerInitializationBegin);
502
_valConsumerInitializationBegin = makeJLabel("");
503
lConsumerInitializationBegin.setLabelFor(_valConsumerInitializationBegin);
504
ReplicationTool.resetGBC(gbc);
505
gbc.gridwidth = gbc.REMAINDER;
506
gbc.anchor = gbc.WEST;
507
gbc.insets = new Insets(space,space,0,space);
508
gb4.setConstraints(_valConsumerInitializationBegin, gbc);
509
_consumerInitPanel.add(_valConsumerInitializationBegin);
511
//last consumer initialization end time
512
JLabel lConsumerInitializationEnd;
513
if (_agreement.getAgreementType() == ReplicationAgreement.AGREEMENT_TYPE_AD) {
514
lConsumerInitializationEnd = makeJLabel(_resource.getString(
515
"sync-info-fullsync-status-end","label"));
517
lConsumerInitializationEnd = makeJLabel(_resource.getString(
518
"replication-info-initconsumer-status-end","label"));
520
ReplicationTool.resetGBC(gbc);
521
gbc.anchor = gbc.EAST;
523
gbc.insets = new Insets(space,space,0,space);
524
gbc.insets.bottom = ReplicationTool.BOTTOM_INSETS.bottom;
525
gb4.setConstraints(lConsumerInitializationEnd, gbc);
526
_consumerInitPanel.add(lConsumerInitializationEnd);
528
_valConsumerInitializationEnd = makeJLabel("");
529
lConsumerInitializationEnd.setLabelFor(_valConsumerInitializationEnd);
530
ReplicationTool.resetGBC(gbc);
531
gbc.gridwidth = gbc.REMAINDER;
532
gbc.anchor = gbc.WEST;
533
gbc.insets = new Insets(space,space,0,space);
534
gbc.insets.bottom = ReplicationTool.BOTTOM_INSETS.bottom;
535
gb4.setConstraints(_valConsumerInitializationEnd, gbc);
536
_consumerInitPanel.add(_valConsumerInitializationEnd);
542
* Called when the object is selected.
544
public void select(IResourceObject parent, IPage viewInstance) {
545
super.select(parent, viewInstance);
551
//===== ITabPanel interface functions =========
552
public boolean validateEntries() {
554
/* now all validation is done through DSEntry
555
provided mechanism before the Save button
556
is enabled. So we don't need to do anyhting
562
public void getUpdateInfo( Object inf ) {
563
AgreementWizardInfo info = (AgreementWizardInfo)inf;
564
info.setDescription(_nameTextField.getText());
567
public boolean refresh() {
574
public void resetCallback() {
579
/*==========================================================
581
*==========================================================*/
583
* Populate the UI with data
585
protected void populateData() {
587
_agreement.updateAgreementFromServer();
589
// _nameDSEntry.fakeInitModel (_agreement.getNickname());
590
_nameTextField.setText( _agreement.getDescription());
591
_fromText.setText(_agreement.getSupplierHost() + ":" +
592
_agreement.getSupplierPort());
593
_toText.setText(_agreement.getConsumerHost() + ":" +
594
_agreement.getConsumerPort());
595
_suffixText.setText(_agreement.getReplicatedSubtree());
596
if (_agreement.getAgreementType() ==
597
ReplicationAgreement.AGREEMENT_TYPE_AD) {
598
_winRepSubtreeText.setText(((ActiveDirectoryAgreement)_agreement).getWinRepArea());
599
_dsRepSubtreeText.setText(((ActiveDirectoryAgreement)_agreement).getDSRepArea());
602
_lastUpdateText.setText(ReplicationTool.convertStatusMessage(
603
_agreement.getLastUpdateStatus()));
604
_valInProgress.setText(_agreement.getInProgress());
605
_valNChangesLast.setText(_agreement.getNChangesLast());
606
_valLastUpdateBegin.setText(_agreement.getLastUpdateBegin());
607
_valLastUpdateEnd.setText(_agreement.getLastUpdateEnd());
609
// consumer initialization status
610
if (!_agreement.getConsumerInitializationBegin().equals(
611
_resource.getString("replication-agreement",
612
"initconsumer-begin-unknown-value"))) {
613
_consumerInitPanel.setVisible(true);
614
_consumerInitializationStatus.setText(ReplicationTool.convertStatusMessage(
615
_agreement.getConsumerInitializationStatus()));
616
_valConsumerInitializationInProgress.setText(_agreement.getConsumerInitializationInProgress());
617
_valConsumerInitializationBegin.setText(_agreement.getConsumerInitializationBegin());
618
_valConsumerInitializationEnd.setText(_agreement.getConsumerInitializationEnd());
620
_consumerInitPanel.setVisible(false);
624
//get replication status
625
private void updateReplicaStatus() {
626
_agreement.updateReplicaStatus();
629
/*==========================================================
631
*==========================================================*/
633
JLabel _fromText, _toText, _suffixText, _winRepSubtreeText, _dsRepSubtreeText;
634
JTextField _nameTextField;
636
JLabel _lastUpdateText, _valInProgress, _valNChangesLast,
637
_valLastUpdateBegin, _valLastUpdateEnd,
638
_consumerInitializationStatus, _valConsumerInitializationInProgress,
639
_valConsumerInitializationBegin, _valConsumerInitializationEnd;
641
JPanel _consumerInitPanel;
643
private DSEntryTextStrict _nameDSEntry;
644
private DSEntrySet entries;
645
private static final String ATTR_DESCRIPTION = "description";