001: package com.sun.portal.app.filesharing.faces;
002:
003: import com.sun.portal.app.filesharing.repo.RepoException;
004: import com.sun.portal.app.filesharing.repo.RepoItem;
005: import com.sun.portal.app.filesharing.repo.Repository;
006: import com.sun.web.ui.component.FileChooser;
007: import com.sun.web.ui.model.ResourceItem;
008: import com.sun.web.ui.model.ResourceModel;
009: import com.sun.web.ui.model.ResourceModelException;
010: import com.sun.web.ui.theme.Theme;
011: import com.sun.web.ui.util.ThemeUtilities;
012:
013: import javax.faces.context.FacesContext;
014: import java.io.Serializable;
015: import java.text.Collator;
016: import java.text.SimpleDateFormat;
017: import java.util.*;
018: import java.util.logging.Level;
019: import java.util.logging.Logger;
020:
021: /**
022: * @author Alejandro Abdelnur
023: */
024: public class RepositoryFCModel implements ResourceModel, Serializable {
025:
026: private static final String SEPARATOR = "/";
027: private static final String SPACE = " ";
028: private static final String ESCAPE = "\\";
029: private static final String DELIMITER = ",";
030: private static final String[] ROOTS = { "/" };
031:
032: private String _filterValue;
033: private String _sortValue;
034: private String _currentDir;
035: private String _serverName;
036:
037: private Repository _repository;
038: private String _user;
039: private FolderBean _folderBean;
040: private static final int FILENAMELEN = 25;
041: private static final int SIZELEN = 5;
042:
043: private static Logger _logger = Logger
044: .getLogger(RepositoryFCModel.class.getName());
045: ResourceBundle rb = null;
046:
047: public RepositoryFCModel(Repository repository, String serverName,
048: String user, FolderBean bean) {
049: _serverName = serverName;
050: _user = user;
051: _currentDir = ROOTS[0];
052: _repository = repository;
053: _folderBean = bean;
054: if (_logger.isLoggable(Level.FINER)) {
055: _logger.log(Level.FINER, "model.<init> server:"
056: + serverName + " user:" + user);
057: }
058: }
059:
060: public String[] getRoots() {
061: return ROOTS;
062: }
063:
064: public String getDelimiterChar() {
065: return DELIMITER;
066: }
067:
068: public String getEscapeChar() {
069: return ESCAPE;
070: }
071:
072: public String getParentFolder() {
073: try {
074: RepoItem item = new RepoItem(_currentDir, "nobody");
075: RepoItem parent = item.getParent();
076: if (parent == null) {
077: parent = item;
078: }
079: return parent.getPath();
080: } catch (RepoException rEx) {
081: throw new RuntimeException("cannot happen");
082: }
083: }
084:
085: public String getAbsoluteRoot() {
086: return ROOTS[0];
087: }
088:
089: public void setAbsoluteRoot(String s) {
090: }
091:
092: public String getSeparatorString() {
093: return SEPARATOR;
094: }
095:
096: public String getServerName() {
097: return _serverName;
098: }
099:
100: public void setServerName(String s) {
101: _serverName = s;
102: }
103:
104: public String getFilterValue() {
105: return (_filterValue == null) ? "" : _filterValue;
106: }
107:
108: public void setFilterValue(String s) {
109: _filterValue = s;
110: }
111:
112: public String getSortValue() {
113: if (_logger.isLoggable(Level.FINER)) {
114: _logger.log(Level.FINER, "model.getSortValue(): "
115: + _sortValue);
116: }
117: return _sortValue;
118: }
119:
120: public void setSortValue(String s) {
121: if (_logger.isLoggable(Level.FINER)) {
122: _logger.log(Level.FINER, "model.setSortValue(" + s + ")");
123: }
124: _sortValue = s;
125: }
126:
127: public String getCurrentDir() {
128: if (_logger.isLoggable(Level.FINER)) {
129: _logger.log(Level.FINER, "model.getCurrentDir(): "
130: + _currentDir);
131: }
132: return _currentDir;
133: }
134:
135: public void setCurrentDir(String s) {
136: if (_logger.isLoggable(Level.FINER)) {
137: _logger.log(Level.FINER, "model.setCurrentDir(" + s + ")");
138: }
139: try {
140: if (_repository.getItemInfo(new RepoItem(s, _user)) != null) {
141: _currentDir = s;
142: _folderBean.clearAlert();
143: } else {
144: // DONT LIKE THIS SPAGETHI THING
145: _folderBean
146: .setAlert(_folderBean.getLocalizedErrorMessage(
147: "repository", "R100"));
148: }
149: } catch (RepoException rex) {
150: // DONT LIKE THIS SPAGETHI THING
151: _folderBean.setAlert(_folderBean.getLocalizedErrorMessage(
152: "repository", rex.getId()));
153: }
154: }
155:
156: public ResourceItem[] getFolderContent(String folder,
157: boolean disableFiles, boolean disableFolders) {
158: if (_logger.isLoggable(Level.FINER)) {
159: _logger.log(Level.FINER,
160: "model.getFolderContent() currentDir: "
161: + _currentDir);
162: }
163: ResourceItem[] modelItems = null;
164: try {
165: RepoItem[] repoItems = _repository.getContent(new RepoItem(
166: _currentDir, _user), getFilterValue());
167: if (repoItems != null && repoItems.length > 0) {
168: modelItems = new ResourceItem[repoItems.length];
169: for (int i = 0; i < repoItems.length; i++) {
170: boolean bIsDirectory = repoItems[i].isDirectory();
171: // if folderchooser then files should look as
172: // if they are disabled.
173: boolean disabled = !bIsDirectory && disableFiles;
174:
175: modelItems[i] = getItem(repoItems[i], disabled);
176: }
177: sort(modelItems);
178: } else {
179: modelItems = new ResourceItem[1];
180: modelItems[0] = new RepositoryFCItem("0", _folderBean
181: .getLocalizedMessage("folder.empty"), null,
182: true);
183: }
184: } catch (RepoException rex) {
185: // DONT LIKE THIS SPAGETHI THING
186: _folderBean.setAlert(_folderBean.getLocalizedErrorMessage(
187: "repository", rex.getId())); // TODO LOG ME
188: modelItems = new ResourceItem[0];
189: }
190: _modelItems = modelItems;
191: return modelItems;
192: }
193:
194: private ResourceItem[] _modelItems;
195:
196: public Object[] getSelectedContent(String[] content,
197: boolean selectFolders) throws ResourceModelException {
198: if (_logger.isLoggable(Level.FINER)) {
199: String s = "";
200: for (int i = 0; content != null && i < content.length; i++) {
201: s += content[i] + ((s.length() == 0) ? "" : ";");
202: }
203: s = "[" + s + "]";
204: _logger.log(Level.FINER, "model.getSelectedContent(" + s
205: + "," + selectFolders + ")");
206: }
207: List l = new ArrayList();
208: if (_modelItems != null) {
209: for (int i = 0; content != null && i < content.length; i++) {
210: String selectedContent = content[i];
211: RepoItem repoItem;
212: try {
213: // repoItem = new RepoItem(_currentDir,"nobody");
214: // repoItem = new RepoItem(repoItem,selectedContent,"nobody");
215: repoItem = new RepoItem(selectedContent, "nobody");
216: } catch (RepoException rex) {
217: throw new RuntimeException("cannot happen");
218: }
219: ResourceItem item = null;
220: for (int j = 0; item == null && j < _modelItems.length; j++) {
221: RepoItem mitem = ((RepositoryFCItem) _modelItems[j])
222: .getRepoItem();
223: if (mitem != null && mitem.equals(repoItem)) {
224: item = _modelItems[j];
225: if (item.isContainerItem() == selectFolders) {
226: l.add(item);
227: }
228: }
229: }
230: }
231: }
232: ResourceItem[] items = new ResourceItem[l.size()];
233: l.toArray(items);
234: return items;
235: }
236:
237: private static class RepoItemComparator implements Comparator {
238: private int _sortType;
239: private Collator _collator;
240:
241: private RepoItemComparator(String sortType) {
242: if (sortType == null) {
243: _sortType = 1;
244: } else if (sortType.equals(FileChooser.ALPHABETIC_DSC)) {
245: _sortType = 2;
246: } else if (sortType.equals(FileChooser.SIZE_ASC)) {
247: _sortType = 4;
248: } else if (sortType.equals(FileChooser.SIZE_DSC)) {
249: _sortType = 8;
250: } else if (sortType.equals(FileChooser.LASTMODIFIED_ASC)) {
251: _sortType = 16;
252: } else if (sortType.equals(FileChooser.LASTMODIFIED_DSC)) {
253: _sortType = 32;
254: } else { // ALPHABETIC_ASC or invalid
255: _sortType = 1;
256: }
257:
258: if (_sortType == 1 || _sortType == 2) {
259: FacesContext context = FacesContext
260: .getCurrentInstance();
261: Locale locale = context.getViewRoot().getLocale();
262: _collator = Collator.getInstance(locale);
263: _collator.setStrength(Collator.SECONDARY);
264: }
265:
266: }
267:
268: public int compare(Object o1, Object o2) {
269: RepoItem r1 = (RepoItem) ((ResourceItem) o1).getItemValue();
270: RepoItem r2 = (RepoItem) ((ResourceItem) o2).getItemValue();
271: int c;
272: switch (_sortType) {
273: case 1:
274: default:
275: c = _collator.compare(r1.getName(), r2.getName());
276: break;
277: case 2:
278: c = -_collator.compare(r1.getName(), r2.getName());
279: break;
280: case 4:
281: c = sign(r1.getLength() - r2.getLength());
282: break;
283: case 8:
284: c = -sign(r1.getLength() - r2.getLength());
285: break;
286: case 16:
287: c = sign(r1.getLastModified() - r2.getLastModified());
288: break;
289: case 32:
290: c = -sign(r1.getLastModified() - r2.getLastModified());
291: break;
292: }
293: return c;
294: }
295:
296: private int sign(long l) {
297: return (l == 0) ? 0 : (l < 0) ? -1 : 1;
298: }
299: }
300:
301: private void sort(ResourceItem[] items) {
302: if ((items == null) || (items.length == 0))
303: return;
304: if (items.length == 1)
305: return;
306: List l = new ArrayList(items.length);
307: for (int i = 0; i < items.length; i++) {
308: l.add(items[i]);
309: }
310: Collections.sort(l, new RepoItemComparator(_sortValue));
311: l.toArray(items);
312: }
313:
314: public ResourceItem getResourceItem(String s) {
315: // nasty thing as tapping into component crap
316: s = s.substring(s.indexOf("=") + 1);
317: ResourceItem item = null;
318: if (_modelItems != null) {
319: for (int i = 0; item == null && i < _modelItems.length; i++) {
320: if (((RepositoryFCItem) _modelItems[i]).getRepoItem()
321: .getPath().equals(s)) {
322: item = _modelItems[i];
323: }
324: }
325: }
326: if (_logger.isLoggable(Level.FINER)) {
327: _logger.log(Level.FINER, "model.getResourceItem(" + s
328: + "): " + item);
329: }
330: return item;
331: }
332:
333: protected RepositoryFCItem getItem(RepoItem item, boolean disabled) {
334: FacesContext facesContext = FacesContext.getCurrentInstance();
335: Theme lockhartTheme = ThemeUtilities.getTheme(facesContext);
336:
337: int fileNameLen = FILENAMELEN;//Integer.parseInt(lockhartTheme.getMessage("filechooser.fileNameLen"));
338: int fileSizeLen = SIZELEN;//Integer.parseInt(lockhartTheme.getMessage("filechooser.fileSizeLen"));
339:
340: Locale locale = facesContext.getViewRoot().getLocale();
341: SimpleDateFormat dateFormat = new SimpleDateFormat(
342: lockhartTheme.getMessage("filechooser.dateFormat"),
343: locale);
344: SimpleDateFormat timeFormat = new SimpleDateFormat(
345: lockhartTheme.getMessage("filechooser.timeFormat"),
346: locale);
347:
348: String name = item.getName();
349: String key;
350: String size;
351: if (item.isDirectory()) {
352: name += SEPARATOR;
353: key = "folder" + "=" + item.getPath();
354: size = _folderBean.getLocalizedMessage("dir.symbol");
355: } else {
356: key = "file" + "=" + item.getPath();
357: long len = item.getLength();
358: String unit = "b";
359: if (len > 1000) {
360: len = len / 1000;
361: unit = "k";
362: if (len > 1000) {
363: len = len / 1000;
364: unit = "m";
365: if (len > 1000) {
366: len = len / 1000;
367: unit = "g";
368: }
369: }
370: }
371: size = Long.toString(len)
372: + _folderBean.getLocalizedMessage("sizeunit."
373: + unit);
374: size = getDisplayString(size, fileSizeLen);
375: }
376: name = getDisplayString(name, fileNameLen);
377: Date modifiedDate = new Date(item.getLastModified());
378: String date = dateFormat.format(modifiedDate);
379: String time = timeFormat.format(modifiedDate);
380: StringBuffer label = new StringBuffer(128);
381: label.append(name).append(SPACE).append(SPACE).append(size)
382: .append(SPACE).append(date).append(SPACE).append(time);
383: return new RepositoryFCItem(key, label.toString(), item,
384: disabled);
385: }
386:
387: private String getDisplayString(String str, int maxLen) {
388:
389: int length = str.length();
390: if (length < maxLen) {
391: int spaceCount = maxLen - length;
392: for (int j = 0; j < spaceCount; j++) {
393: str += SPACE;
394: }
395: } else if (length > maxLen) {
396: int shownLen = maxLen - 3;
397: str = str.substring(0, shownLen);
398: str += _folderBean.getLocalizedMessage("truncate.suffix");
399: }
400: return str;
401: }
402:
403: public boolean isFolderType(String s) {
404: ResourceItem item = getResourceItem(s);
405: boolean b = (item != null) ? item.isContainerItem() : false;
406: if (_logger.isLoggable(Level.FINER)) {
407: _logger.log(Level.FINER, "model.isFolderType(" + s + "): "
408: + b);
409: }
410: return b;
411: }
412:
413: public boolean canRead(String s) {
414: return true;
415: }
416:
417: public boolean canWrite(String s) {
418: return true;
419: }
420:
421: }
|