This project has retired. For details please refer to its Attic page.
ChangeLogFrame xref

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.chemistry.opencmis.workbench;
20  
21  import java.awt.BorderLayout;
22  import java.awt.Cursor;
23  import java.awt.Dimension;
24  import java.awt.event.ActionEvent;
25  import java.awt.event.ActionListener;
26  import java.util.Collection;
27  import java.util.GregorianCalendar;
28  import java.util.List;
29  
30  import javax.swing.BorderFactory;
31  import javax.swing.JButton;
32  import javax.swing.JFrame;
33  import javax.swing.JLabel;
34  import javax.swing.JPanel;
35  import javax.swing.JScrollPane;
36  import javax.swing.JTable;
37  import javax.swing.JTextField;
38  import javax.swing.table.AbstractTableModel;
39  import javax.swing.table.TableColumn;
40  
41  import org.apache.chemistry.opencmis.client.api.ChangeEvent;
42  import org.apache.chemistry.opencmis.client.api.ChangeEvents;
43  import org.apache.chemistry.opencmis.workbench.model.ClientModel;
44  import org.apache.chemistry.opencmis.workbench.swing.CollectionRenderer;
45  import org.apache.chemistry.opencmis.workbench.swing.GregorianCalendarRenderer;
46  
47  public class ChangeLogFrame extends JFrame {
48  
49      private static final long serialVersionUID = 1L;
50  
51      private static final String WINDOW_TITLE = "CMIS Change Log";
52  
53      private final ClientModel model;
54  
55      private JTextField changeLogTokenField;
56      private ChangeLogTable changeLogTable;
57  
58      public ChangeLogFrame(ClientModel model) {
59          super();
60  
61          this.model = model;
62          createGUI();
63      }
64  
65      private void createGUI() {
66          setTitle(WINDOW_TITLE + " - " + model.getRepositoryName());
67          setPreferredSize(new Dimension(700, 700));
68          setMinimumSize(new Dimension(200, 60));
69  
70          setLayout(new BorderLayout());
71  
72          JPanel inputPanel = new JPanel(new BorderLayout());
73          inputPanel.setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3));
74  
75          inputPanel.add(new JLabel("Change Log Token: "), BorderLayout.LINE_START);
76  
77          changeLogTokenField = new JTextField();
78          try {
79              changeLogTokenField.setText(model.getRepositoryInfo().getLatestChangeLogToken());
80          } catch (Exception e1) {
81          }
82          inputPanel.add(changeLogTokenField, BorderLayout.CENTER);
83  
84          JButton loadButton = new JButton("Load");
85          loadButton.addActionListener(new ActionListener() {
86              @Override
87              public void actionPerformed(ActionEvent e) {
88  
89                  String changeLogToken = changeLogTokenField.getText();
90                  if (changeLogToken.trim().length() == 0) {
91                      changeLogToken = null;
92                  }
93  
94                  ChangeEvents events = null;
95                  try {
96                      setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
97                      events = model.getClientSession().getSession().getContentChanges(changeLogToken, true, 1000);
98                  } catch (Exception ex) {
99                      ClientHelper.showError(null, ex);
100                     return;
101                 } finally {
102                     setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
103                 }
104 
105                 changeLogTable.setChangeEvents(events.getChangeEvents());
106                 changeLogTokenField.setText(events.getLatestChangeLogToken() == null ? "" : events
107                         .getLatestChangeLogToken());
108             }
109         });
110         inputPanel.add(loadButton, BorderLayout.LINE_END);
111         getRootPane().setDefaultButton(loadButton);
112 
113         add(inputPanel, BorderLayout.PAGE_START);
114 
115         changeLogTable = new ChangeLogTable();
116         add(new JScrollPane(changeLogTable), BorderLayout.CENTER);
117 
118         ClientHelper.installEscapeBinding(this, getRootPane(), true);
119 
120         setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
121         pack();
122 
123         setLocationRelativeTo(null);
124         setVisible(true);
125     }
126 
127     static class ChangeLogTable extends JTable {
128 
129         private static final long serialVersionUID = 1L;
130 
131         private static final String[] COLUMN_NAMES = { "Change Type", "Object Id", "Change Time", "Properties" };
132         private static final int[] COLUMN_WIDTHS = { 100, 200, 200, 400 };
133 
134         private List<ChangeEvent> changeEvents;
135 
136         public ChangeLogTable() {
137             setDefaultRenderer(GregorianCalendar.class, new GregorianCalendarRenderer());
138             setDefaultRenderer(Collection.class, new CollectionRenderer());
139             setModel(new ChangeLogTableModel(this));
140 
141             setAutoResizeMode(AUTO_RESIZE_OFF);
142             setAutoCreateRowSorter(true);
143 
144             for (int i = 0; i < COLUMN_WIDTHS.length; i++) {
145                 TableColumn column = getColumnModel().getColumn(i);
146                 column.setPreferredWidth(COLUMN_WIDTHS[i]);
147             }
148 
149             setFillsViewportHeight(true);
150         }
151 
152         public void setChangeEvents(List<ChangeEvent> changeEvents) {
153             this.changeEvents = changeEvents;
154             ((AbstractTableModel) getModel()).fireTableDataChanged();
155         }
156 
157         public List<ChangeEvent> getChangeEvents() {
158             return changeEvents;
159         }
160 
161         static class ChangeLogTableModel extends AbstractTableModel {
162 
163             private static final long serialVersionUID = 1L;
164 
165             private final ChangeLogTable table;
166 
167             public ChangeLogTableModel(ChangeLogTable table) {
168                 this.table = table;
169             }
170 
171             public String getColumnName(int columnIndex) {
172                 return COLUMN_NAMES[columnIndex];
173             }
174 
175             public int getColumnCount() {
176                 return COLUMN_NAMES.length;
177             }
178 
179             public int getRowCount() {
180                 if (table.getChangeEvents() == null) {
181                     return 0;
182                 }
183 
184                 return table.getChangeEvents().size();
185             }
186 
187             public Object getValueAt(int rowIndex, int columnIndex) {
188                 ChangeEvent event = table.getChangeEvents().get(rowIndex);
189 
190                 switch (columnIndex) {
191                 case 0:
192                     return (event.getChangeType() == null ? "?" : event.getChangeType().value());
193                 case 1:
194                     return (event.getObjectId() == null ? "?" : event.getObjectId());
195                 case 2:
196                     return event.getChangeTime();
197                 case 3:
198                     return event.getProperties().entrySet();
199                 }
200 
201                 return null;
202             }
203 
204             @Override
205             public Class<?> getColumnClass(int columnIndex) {
206                 if (columnIndex == 2) {
207                     return GregorianCalendar.class;
208                 } else if (columnIndex == 3) {
209                     return Collection.class;
210                 }
211 
212                 return super.getColumnClass(columnIndex);
213             }
214         }
215     }
216 }