File Source: theme.java
1 /*
2 * Copyright (c) 2003-2006, Simon Brown
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * - Neither the name of Pebble nor the names of its contributors may
17 * be used to endorse or promote products derived from this software
18 * without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32 package net.sourceforge.pebble.domain;
33
34 import net.sourceforge.pebble.util.FileUtils;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37
38 import java.io.File;
39 import java.io.FileInputStream;
40 import java.io.FileOutputStream;
41 import java.io.IOException;
42 import java.nio.channels.FileChannel;
43
44 /**
45 * Represents the user's editable theme.
46 *
47 * @author Simon Brown
48 */
49 public class Theme {
50
51 /** the log used by this class */
/*
P/P * Method: net.sourceforge.pebble.domain.Theme__static_init
*
* Postconditions:
* init'ed(log)
*/
52 private static Log log = LogFactory.getLog(Theme.class);
53
54 /** the name of the theme that should be used as a default */
55 public static final String DEFAULT_THEME_NAME = "default";
56
57 /** the blog to which this theme belongs */
58 private Blog blog;
59
60 /** the name of the theme */
61 private String name;
62
63 /** the path of the live theme (under the webapp root) */
64 private String pathToLiveThemes;
65
66 /**
67 * Creates a new Theme instance with the specified details.
68 *
69 * @param blog the owning Blog instance
70 * @param name the name of the theme
71 * @param pathToLiveThemes the path to the live themes
72 */
/*
P/P * Method: void net.sourceforge.pebble.domain.Theme(Blog, String, String)
*
* Postconditions:
* this.blog == blog
* init'ed(this.blog)
* this.name == name
* init'ed(this.name)
* this.pathToLiveThemes == pathToLiveThemes
* init'ed(this.pathToLiveThemes)
*/
73 public Theme(Blog blog, String name, String pathToLiveThemes) {
74 this.blog = blog;
75 this.name = name;
76 this.pathToLiveThemes = pathToLiveThemes;
77 }
78
79 /**
80 * Gets the location where the backup version of the blog theme is stored -
81 * under the blog.dir directory, in a sub-directory called "theme".
82 *
83 * @return an absolute, local path on the filing system
84 */
85 String getBackupThemeDirectory() {
/*
P/P * Method: String getBackupThemeDirectory()
*
* Preconditions:
* this.blog != null
*
* Presumptions:
* init'ed(java.io.File.separator)
*
* Postconditions:
* return_value != null
*/
86 return blog.getRoot() + File.separator + "theme";
87 }
88
89 public File getPathToLiveTheme() {
/*
P/P * Method: File getPathToLiveTheme()
*
* Preconditions:
* init'ed(this.name)
* init'ed(this.pathToLiveThemes)
*
* Postconditions:
* return_value == &new File(getPathToLiveTheme#1)
* new File(getPathToLiveTheme#1) num objects == 1
*/
90 return new File(pathToLiveThemes, name);
91 }
92
93 /**
94 * Restores the theme from the blog.dir to the webapp.
95 */
96 public void restore() {
/*
P/P * Method: void restore()
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.name)
* init'ed(this.pathToLiveThemes)
*/
97 restore(DEFAULT_THEME_NAME);
98 }
99
100 /**
101 * Restores the theme from the blog.dir to the webapp.
102 */
103 public void restore(String themeName) {
/*
P/P * Method: void restore(String)
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.name)
* init'ed(this.pathToLiveThemes)
*
* Presumptions:
* java.io.File:listFiles(...)@105 != null
*
* Test Vectors:
* java.io.File:exists(...)@105: {0}, {1}
* java.io.File:listFiles(...).length@105: {1..+Inf}, {0}
*/
104 File blogTheme = new File(getBackupThemeDirectory());
105 if (!blogTheme.exists() || blogTheme.listFiles().length == 0) {
106 copy(themeName);
107 }
108
109 log.debug("Restoring " + name + " theme from " + getBackupThemeDirectory());
110 copy(blogTheme, getPathToLiveTheme());
111 }
112
113 /**
114 * Restores the theme from the blog.dir to the webapp.
115 */
116 public void restoreToSpecifiedTheme(String themeName) {
/*
P/P * Method: void restoreToSpecifiedTheme(String)
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.name)
* init'ed(this.pathToLiveThemes)
*/
117 File blogTheme = new File(getBackupThemeDirectory());
118 FileUtils.deleteFile(blogTheme);
119 FileUtils.deleteFile(getPathToLiveTheme());
120 restore(themeName);
121 }
122
123 /**
124 * Backs up the theme from the webapp to the blog.dir.
125 */
126 public void backup() {
/*
P/P * Method: void backup()
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.name)
* init'ed(this.pathToLiveThemes)
*/
127 backup(name);
128 }
129
130 /**
131 * Backs up the named theme from the webapp to the blog.dir.
132 *
133 * @param themeName the name of the theme to backup
134 */
135 private void backup(String themeName) {
/*
P/P * Method: void backup(String)
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.pathToLiveThemes)
*
* Test Vectors:
* java.io.File:exists(...)@141: {0}, {1}
*/
136 log.debug("Backing up " + themeName + " theme to " + getBackupThemeDirectory());
137 File liveTheme = new File(pathToLiveThemes, themeName);
138 File blogTheme = new File(getBackupThemeDirectory());
139 File blogThemeBackup = new File(getBackupThemeDirectory() + ".bak");
140
141 if (blogTheme.exists()) {
142 blogTheme.renameTo(blogThemeBackup);
143 }
144 copy(liveTheme, blogTheme);
145 FileUtils.deleteFile(blogThemeBackup);
146 }
147
148 /**
149 * Copies the named theme from the webapp to blog.dir/theme.
150 *
151 * @param themeName the name of the theme to backup
152 */
153 private void copy(String themeName) {
/*
P/P * Method: void copy(String)
*
* Preconditions:
* log != null
* this.blog != null
* init'ed(this.pathToLiveThemes)
*
* Test Vectors:
* java.io.File:exists(...)@159: {0}, {1}
*/
154 log.info("Copying " + themeName + " theme to " + getBackupThemeDirectory());
155 File liveTheme = new File(pathToLiveThemes, themeName);
156 File blogTheme = new File(getBackupThemeDirectory());
157 File blogThemeBackup = new File(getBackupThemeDirectory() + ".bak");
158
159 if (blogTheme.exists()) {
160 blogTheme.renameTo(blogThemeBackup);
161 }
162 copy(liveTheme, blogTheme);
163 FileUtils.deleteFile(blogThemeBackup);
164 }
165
166 /**
167 * Copies one file to another.
168 *
169 * @param source the source
170 * @param destination the destination
171 */
172 private void copy(File source, File destination) {
/*
P/P * Method: void copy(File, File)
*
* Preconditions:
* destination != null
* source != null
* (soft) log != null
*
* Presumptions:
* files.length@177 <= 232-1
* files[i]@177 != null
* java.io.FileInputStream:getChannel(...)@184 != null
* java.io.FileOutputStream:getChannel(...)@185 != null
*
* Test Vectors:
* java.io.File:exists(...)@173: {1}, {0}
* java.io.File:isDirectory(...)@180: {0}, {1}
* java.io.File:listFiles(...)@177: Addr_Set{null}, Inverse{null}
*/
173 if (!destination.exists()) {
174 destination.mkdir();
175 }
176
177 File files[] = source.listFiles();
178 if (files != null) {
179 for (int i = 0; i < files.length; i++) {
180 if (files[i].isDirectory()) {
181 copy(files[i], new File(destination, files[i].getName()));
182 } else {
183 try {
184 FileChannel srcChannel = new FileInputStream(files[i]).getChannel();
185 FileChannel dstChannel = new FileOutputStream(new File(destination, files[i].getName())).getChannel();
186 dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
187 srcChannel.close();
188 dstChannel.close();
189 } catch (IOException ioe) {
190 log.error("Could not write to " + destination.getAbsolutePath(), ioe);
191 }
192 }
193 }
194 }
195 }
196
197 /**
198 * Gets the name of this theme.
199 *
200 * @return the name
201 */
202 public String getName() {
/*
P/P * Method: String getName()
*
* Preconditions:
* init'ed(this.name)
*
* Postconditions:
* return_value == this.name
* init'ed(return_value)
*/
203 return name;
204 }
205
206 }
SofCheck Inspector Build Version : 2.22510
| theme.java |
2010-Jun-25 19:40:32 |
| theme.class |
2010-Jul-19 20:23:40 |