Dateiverwaltung für die WebBox
ulrich
2021-01-01 5794c8f1f5e48dea6afe808e374265ca69f7419a
commit | author | age
17727f 1 /*
U 2     Dateiverwaltung - File management in your browser
3     Copyright (C) 2017 Ulrich Hilger, http://uhilger.de
4
5     This program is free software: you can redistribute it and/or modify
6     it under the terms of the GNU Affero General Public License as
7     published by the Free Software Foundation, either version 3 of the
8     License, or (at your option) any later version.
9
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 Affero General Public License for more details.
14
15     You should have received a copy of the GNU Affero General Public License
16     along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
6e70be 19 package de.uhilger.filecms.web;
U 20
17727f 21 import de.uhilger.wbx.WbxUtils;
U 22 import java.io.File;
23 import java.io.IOException;
24 import java.util.logging.Level;
6e70be 25 import java.util.logging.Logger;
U 26 import javax.servlet.ServletContext;
21589e 27 import javax.servlet.ServletContextEvent;
U 28 import javax.servlet.ServletContextListener;
17727f 29 import org.apache.commons.io.FileUtils;
6e70be 30
U 31 /**
17727f 32  * Initialisieren der Dateiverwaltung
6e70be 33  */
17727f 34
U 35 /*
5794c8 36     der folgende Eintrag kann z.B. in $CATALINA_BASE/conf/context.xml 
U 37     eingetragen werden
38
17727f 39     <Environment  
U 40       name="wbxFileBase"
41       type="java.lang.String"
42       value="/media/wbx-data/cms"
43       override="false"
44     />
45
46 */
21589e 47 public class Initialiser implements ServletContextListener {
6e70be 48   
U 49   private static final Logger logger = Logger.getLogger(Initialiser.class.getName());
17727f 50   
U 51   public static final String FILE_BASE = "filebase";
52   public static final String DATENABLAGE = "datenAblage";
53   public static final String WBX_FILE_BASE = "wbxFileBase";
5794c8 54     
17727f 55   /**
U 56    * Die Dateiablage wird entweder auf einen absoluten Pfad gesetzt, 
57    * der im Deployment Descriptor hinterlegt werden kann oder, wenn 
58    * dort nichts eingetragen ist, auf den hart kodierten Pfad 
59    * der WebBox.
60    * 
61    * @param ctx der ServletContext, in den die Angabe eingetragen wird. Dort 
62    * ist anschliessend die Angabe unter Initialiser.FILE_BASE abrufbar
63    */
64   protected void ablageErmitteln(ServletContext ctx) {
65     //Object o = ctx.getInitParameter(DATENABLAGE);
5794c8 66     
U 67     //File wbxDaten = getDataDir(ctx, 2, "data/");
68     
17727f 69     WbxUtils wu = new WbxUtils();
U 70     Object o = wu.getJNDIParameter(WBX_FILE_BASE, WbxUtils.EMPTY_STRING);
71     try {
72       if(o instanceof String) {
73         String pfad = o.toString();
74         if(pfad.trim().length() > 0) {
75           ctx.setAttribute(FILE_BASE, pfad);
5794c8 76           logger.log(Level.INFO, "Daten-Ordner aus wbxFileBase: {0}", pfad);
17727f 77         } else {
5794c8 78           ctx.setAttribute(FILE_BASE, getDataDir(ctx, 2, "data/").getAbsolutePath());  
17727f 79         }
U 80       } else {
5794c8 81         ctx.setAttribute(FILE_BASE, getDataDir(ctx, 2, "data/").getAbsolutePath());      
17727f 82       }    
U 83     } catch(Exception ex) {
5794c8 84       ctx.setAttribute(FILE_BASE, getDataDir(ctx, 2, "data/").getAbsolutePath());
17727f 85     }
U 86   }  
5794c8 87   
U 88   /**
89    * Daten-Ordner relativ zum Ablageort des file-cms finden.
90    * 
91    * Die Standard-Struktur einer WebBox sieht folgende Ordner vor
92    * 
93    * wbx/apps
94    * wbx/data
95    * 
96    * Liegt das file-cms z.B. im Ordner /home/ulrich/dev/srv/wbx-3/apps/file-cms 
97    * kann von dort aus der Daten-Ordner mit 
98    * getDataDir(ctx, 2, "data/")
99    * gefunden werden. 
100    * 
101    * @param ctx  der ServletContext, in dem das file-cms laeuft
102    * @param tiefe Anzahl Ordner, die der Ablageort des file-cms vom 
103    * Eltern-Ordner entfernt ist
104    * @param pfad der Pfad zum Daten-Ordner ausgehend vom Eltern-Ordner
105    * @return Daten-Ordner
106    */
107   private File getDataDir(ServletContext ctx, int tiefe, String pfad) {
108     File appsOrdner = new File(ctx.getRealPath("/"));
109     logger.log(Level.INFO, "Apps-Ordner: {0}", appsOrdner.getAbsolutePath());
110     File wbx = new File(appsOrdner, "");
111     for(int i = 0; i < tiefe; i++) {
112       wbx = wbx.getParentFile();
113     }
114     logger.log(Level.INFO, "Wbx-Ordner: {0}", wbx.getAbsolutePath());
115     File daten = new File(wbx, pfad);
116     logger.log(Level.INFO, "Daten-Ordner: {0}", daten.getAbsolutePath());
117     return daten;
118   }
17727f 119   
U 120   protected void ablageInitialisieren(ServletContext ctx) {
121     Object o = ctx.getAttribute(FILE_BASE);
122     if(o instanceof String) {
123       String targetDirName = (String) o;
124       File dataDir = new File(targetDirName, "www");
125       if(!dataDir.exists()) {
126         dataDir.mkdirs();
127         String srcPath = ctx.getRealPath("/"); // file-cms in webapps
128         File srcDir = new File(srcPath, "/META-INF/daten/www");
129         dataDir = new File(targetDirName);
130         try {
131           FileUtils.copyDirectoryToDirectory(srcDir, dataDir);
132           srcDir = new File(srcPath, "/META-INF/daten/home");
133           FileUtils.copyDirectoryToDirectory(srcDir, dataDir);
134           srcDir = new File(srcPath, "/META-INF/daten/dav");
135           FileUtils.copyDirectoryToDirectory(srcDir, dataDir);   
136         } catch (IOException ex) {
137           logger.log(Level.SEVERE, null, ex);
138         }
139       }
140     }
141   }
142
21589e 143   @Override
U 144   public void contextInitialized(ServletContextEvent sce) {
145     ServletContext ctx = sce.getServletContext();
17727f 146     ablageErmitteln(ctx);
U 147     ablageInitialisieren(ctx);
21589e 148   }
U 149
150   @Override
151   public void contextDestroyed(ServletContextEvent sce) {
152     ServletContext ctx = sce.getServletContext();
153     ctx.removeAttribute(FILE_BASE);
154   }
6e70be 155     
U 156 }