]> source.dussan.org Git - archiva.git/blob
f4e21ae49d25b58fd11ba30dc8cb38165211b24e
[archiva.git] /
1 package org.apache.archiva.webdav.util;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *  http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import org.apache.commons.lang.StringUtils;
23 import org.apache.jackrabbit.webdav.DavResource;
24 import org.apache.jackrabbit.webdav.io.OutputContext;
25
26 import java.io.File;
27 import java.io.PrintWriter;
28 import java.text.DateFormat;
29 import java.text.DecimalFormat;
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.Collections;
33 import java.util.Date;
34 import java.util.HashMap;
35 import java.util.List;
36 import java.util.Locale;
37 import java.util.Map;
38
39 /**
40  */
41 public class IndexWriter
42 {
43     private final String logicalResource;
44
45     private final List<File> localResources;
46
47     private final boolean isVirtual;
48
49     public IndexWriter( DavResource resource, File localResource, String logicalResource )
50     {
51         this.localResources = new ArrayList<File>();
52         this.localResources.add( localResource );
53         this.logicalResource = logicalResource;
54         this.isVirtual = false;
55     }
56
57     public IndexWriter( DavResource resource, List<File> localResources, String logicalResource )
58     {
59         this.logicalResource = logicalResource;
60         this.localResources = localResources;
61         this.isVirtual = true;
62     }
63
64     public void write( OutputContext outputContext )
65     {
66         outputContext.setModificationTime( new Date().getTime() );
67         outputContext.setContentType( "text/html" );
68         outputContext.setETag( "" ); // skygo ETag MRM-1127 seems to be fixed
69         if ( outputContext.hasStream() )
70         {
71             PrintWriter writer = new PrintWriter( outputContext.getOutputStream() );
72             writeDocumentStart( writer );
73             writeHyperlinks( writer );
74             writeDocumentEnd( writer );
75             writer.flush();
76             writer.close();
77         }
78     }
79
80     private void writeDocumentStart( PrintWriter writer )
81     {
82         writer.println("<!DOCTYPE html>");
83         writer.println( "<html>" );
84         writer.println( "<head>" );
85         writer.println( "<title>Collection: /" + logicalResource + "</title>" );
86         writer.println( "<style type=\"text/css\">" );
87         writer.println( "ul{list-style:none;}" ); //list-style-image: url("../images/folder.png");
88         StringBuilder relative = new StringBuilder("../../");
89         if ( logicalResource.length() > 0 ) 
90         {
91             String tmpRelative = StringUtils.replace( logicalResource, "\\", "/" );
92             for (int i=0;i<tmpRelative.split("/").length;i++) 
93             {
94                 relative.append("../");
95             }
96         }
97         writer.println( ".file{background:url(" + relative.toString() + "images/package-x-generic.png) no-repeat scroll 0 0 transparent;}" );
98         writer.println( ".folder{background:url(" + relative.toString() + "images/folder.png) no-repeat scroll 0 0 transparent;}" );
99         writer.println( "a{color:#0088CC;text-decoration: none;padding-left:20px;}" );
100         writer.println( ".collection tr:nth-child(odd){background-color:#fafafa;}" );
101         writer.println( "tr td:nth-child(2){width:150px;color:#cc8800;text-align:right;}" );
102         writer.println( "tr td:nth-child(3){width:150px;color:#0000cc;text-align:center;}" );
103         writer.println( "th td:nth-child(2){width:150px;}" );
104         writer.println( "th td:nth-child(3){width:150px;}" );
105         writer.println( "</style>" );
106         writer.println( "</head>" );
107         writer.println( "<body>" );
108         writer.println( "<h3>Collection: /" + logicalResource + "</h3>" );
109
110         //Check if not root
111         if ( logicalResource.length() > 0 )
112         {
113             File file = new File( logicalResource );
114             String parentName = file.getParent() == null ? "/" : file.getParent();
115
116             //convert to unix path in case archiva is hosted on windows
117             parentName = StringUtils.replace( parentName, "\\", "/" );
118
119             writer.println( "<ul>" );
120             writer.println( "<li><a class=\"folder\" href=\"../\">" + parentName + "</a> <i><small>(Parent)</small></i></li>" );
121             writer.println( "</ul>" );
122         }
123
124         writer.println( "<table class=\"collection\">" );
125         writer.println( "<tr><th>Name</th><th>Size (Bytes)</th><th>Last Modified</th></tr>" );
126     }
127
128     private void writeDocumentEnd( PrintWriter writer )
129     {
130         writer.println( "</table>" );
131         writer.println( "</body>" );
132         writer.println( "</html>" );
133     }
134
135     private void writeHyperlinks( PrintWriter writer )
136     {
137         if ( !isVirtual )
138         {
139             for ( File localResource : localResources )
140             {
141                 List<File> files = new ArrayList<File>( Arrays.asList( localResource.listFiles() ) );
142                 Collections.sort( files );
143
144                 for ( File file : files )
145                 {
146                     writeHyperlink( writer, file.getName(), file.lastModified(), file.length(), file.isDirectory() );
147                 }
148             }
149         }
150         else
151         {
152             // virtual repository - filter unique directories
153             Map<String, List<String>> uniqueChildFiles = new HashMap<String, List<String>>();
154             List<String> sortedList = new ArrayList<String>();
155             for ( File resource : localResources )
156             {
157                 List<File> files = new ArrayList<File>( Arrays.asList( resource.listFiles() ) );
158                 for ( File file : files )
159                 {
160                     List<String> mergedChildFiles = new ArrayList<String>();
161                     if ( uniqueChildFiles.get( file.getName() ) == null )
162                     {
163                         mergedChildFiles.add( file.getAbsolutePath() );
164                     }
165                     else
166                     {
167                         mergedChildFiles = uniqueChildFiles.get( file.getName() );
168                         if ( !mergedChildFiles.contains( file.getAbsolutePath() ) )
169                         {
170                             mergedChildFiles.add( file.getAbsolutePath() );
171                         }
172                     }
173                     uniqueChildFiles.put( file.getName(), mergedChildFiles );
174                     sortedList.add( file.getName() );
175                 }
176             }
177
178             Collections.sort( sortedList );
179             List<String> written = new ArrayList<String>();
180             for ( String fileName : sortedList )
181             {
182                 List<String> childFilesFromMap = uniqueChildFiles.get( fileName );
183                 for ( String childFilePath : childFilesFromMap )
184                 {
185                     File childFile = new File( childFilePath );
186                     if ( !written.contains( childFile.getName() ) )
187                     {
188                         written.add( childFile.getName() );
189                         writeHyperlink( writer, fileName, childFile.lastModified(), childFile.length(), childFile.isDirectory() );
190                     }
191                 }
192             }
193         }
194     }
195
196     private static String fileDateFormat( long date ) 
197     {
198         DateFormat dateFormatter = DateFormat.getDateTimeInstance( DateFormat.SHORT, DateFormat.SHORT, Locale.getDefault() );
199         Date aDate = new Date( date );
200         return dateFormatter.format( aDate );
201     }
202     
203     private void writeHyperlink( PrintWriter writer, String resourceName, long lastModified, long fileSize, boolean directory )
204     {
205         if ( directory )
206         {
207             writer.println( "<tr><td><a class=\"folder\" href=\"" + resourceName + "/\">" + resourceName + "</a></td><td>&nbsp;</td><td>&nbsp;</td></tr>" );
208         }
209         else
210         {
211             writer.println( "<tr><td><a class=\"file\" href=\"" + resourceName + "\">" + resourceName + "</a></td><td class=\"size\">" + fileSize + "&nbsp;&nbsp;</td><td class=\"date\">" + fileDateFormat( lastModified ) + "</td></tr>" );
212         }
213     }
214 }