001    /*
002     * This file is part of McIDAS-V
003     *
004     * Copyright 2007-2013
005     * Space Science and Engineering Center (SSEC)
006     * University of Wisconsin - Madison
007     * 1225 W. Dayton Street, Madison, WI 53706, USA
008     * https://www.ssec.wisc.edu/mcidas
009     * 
010     * All Rights Reserved
011     * 
012     * McIDAS-V is built on Unidata's IDV and SSEC's VisAD libraries, and
013     * some McIDAS-V source code is based on IDV and VisAD source code.  
014     * 
015     * McIDAS-V is free software; you can redistribute it and/or modify
016     * it under the terms of the GNU Lesser Public License as published by
017     * the Free Software Foundation; either version 3 of the License, or
018     * (at your option) any later version.
019     * 
020     * McIDAS-V is distributed in the hope that it will be useful,
021     * but WITHOUT ANY WARRANTY; without even the implied warranty of
022     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
023     * GNU Lesser Public License for more details.
024     * 
025     * You should have received a copy of the GNU Lesser Public License
026     * along with this program.  If not, see http://www.gnu.org/licenses.
027     */
028    package edu.wisc.ssec.mcidasv.startupmanager;
029    
030    import java.util.Properties;
031    
032    import edu.wisc.ssec.mcidasv.Constants;
033    import edu.wisc.ssec.mcidasv.startupmanager.options.OptionMaster;
034    
035    public enum Platform {
036        /** Instance of unix-specific platform information. */
037        UNIXLIKE("/", "runMcV.prefs", "\n"),
038        
039        /** Instance of windows-specific platform information. */
040        WINDOWS("\\", "runMcV-Prefs.bat", "\r\n");
041        
042        /** Path to the user's {@literal "userpath"} directory. */
043        private String userDirectory;
044        
045        /** The path to the user's copy of the startup preferences. */
046        private String userPrefs;
047        
048        /** Path to the preference file that ships with McIDAS-V. */
049        private final String defaultPrefs;
050        
051        /** Holds the platform's representation of a new line. */
052        private final String newLine;
053        
054        /** Directory delimiter for the current platform. */
055        private final String pathSeparator;
056        
057        /** Total amount of memory avilable in megabytes */
058        private int availableMemory = 0;
059        
060        /**
061         * Initializes the platform-specific paths to the different files 
062         * required by the startup manager.
063         * 
064         * @param pathSeparator Character that delimits directories. On Windows
065         * this will be {@literal \\}, while on Unix-style systems, it will be
066         * {@literal /}.
067         * @param defaultPrefs The path to the preferences file that ships with
068         * McIDAS-V.
069         * @param newLine Character(s!) that represent a new line for this 
070         * platform.
071         * 
072         * @throws NullPointerException if either {@code pathSeparator} or 
073         * {@code defaultPrefs} are null.
074         * 
075         * @throws IllegalArgumentException if either {@code pathSeparator} or
076         * {@code defaultPrefs} are an empty string.
077         */
078        Platform(final String pathSeparator, final String defaultPrefs, 
079            final String newLine) 
080        {
081            if (pathSeparator == null || defaultPrefs == null) {
082                throw new NullPointerException("");
083            }
084            if (pathSeparator.isEmpty() || defaultPrefs.isEmpty()) {
085                throw new IllegalArgumentException("");
086            }
087            
088            String osName = System.getProperty("os.name");
089            if (osName.startsWith("Mac OS X")) {
090                this.userDirectory = System.getProperty("user.home") + pathSeparator + "Documents" + pathSeparator + Constants.USER_DIRECTORY_NAME;
091            } else {
092                this.userDirectory = System.getProperty("user.home") + pathSeparator + Constants.USER_DIRECTORY_NAME;
093            }
094            this.userPrefs = userDirectory + pathSeparator + defaultPrefs;
095            this.defaultPrefs = defaultPrefs;
096            this.newLine = newLine;
097            this.pathSeparator = pathSeparator;
098        }
099        
100        /**
101         * Sets the path to the user's userpath directory explicitly.
102         * 
103         * @param path New path. Cannot be {@code null}.
104         */
105        public void setUserDirectory(final String path) {
106            userDirectory = path;
107            userPrefs = userDirectory + pathSeparator + defaultPrefs;
108        }
109        
110        /**
111         * Sets the amount of available memory. {@code megabytes} must be 
112         * greater than or equal to zero.
113         * 
114         * @param megabytes Memory in megabytes
115         * 
116         * @throws NullPointerException if {@code megabytes} is {@code null}.
117         * @throws IllegalArgumentException if {@code megabytes} is less than
118         * zero or does not represent an integer.
119         * 
120         * @see StartupManager#getArgs
121         */
122        public void setAvailableMemory(String megabytes) {
123            if (megabytes == null) {
124                throw new NullPointerException("Available memory cannot be null");
125            }
126            if (megabytes.isEmpty()) {
127                megabytes = "0";
128            }
129            
130            try {
131                int test = Integer.parseInt(megabytes);
132                if (test < 0) {
133                    throw new IllegalArgumentException("Available memory must be a non-negative integer, not \""+megabytes+"\"");
134                }
135                availableMemory = test;
136            } catch (NumberFormatException e) {
137                throw new IllegalArgumentException("Could not convert \""+megabytes+"\" to a non-negative integer");
138            }
139        }
140        
141        /**
142         * Returns the path to the user's {@literal "userpath"} directory.
143         * 
144         * @return Path to the user's directory.
145         */
146        public String getUserDirectory() {
147            return userDirectory;
148        }
149        
150        /**
151         * Returns the path to a file in the user's {@literal "userpath"} directory.
152         * 
153         * @param filename Filename within the {@code userpath}. Cannot be 
154         * {@code null}, but does not need to be a filename that already exists 
155         * within the {@code userpath}.
156         * 
157         * @return Path to a file in the user's directory. <b>Note:</b> the file 
158         * may not yet exist.
159         */
160        public String getUserFile(String filename) {
161            return getUserDirectory() + pathSeparator + filename;
162        }
163        
164        public String getUserBundles() {
165            return getUserDirectory() + pathSeparator + "bundles";
166        }
167        
168        /**
169         * Returns the amount of available memory in megabytes
170         * 
171         * @return Available memory in megabytes
172         */
173        public int getAvailableMemory() {
174            return availableMemory;
175        }
176        
177        /**
178         * Returns the path of user's copy of the startup preferences.
179         * 
180         * @return Path to the user's startup preferences file.
181         */
182        public String getUserPrefs() {
183            return userPrefs;
184        }
185        
186        /**
187         * Returns the path of the startup preferences included in the McIDAS-V
188         * distribution. Mostly useful for normalizing the user 
189         * directory.
190         * 
191         * @return Path to the default startup preferences.
192         * 
193         * @see OptionMaster#normalizeUserDirectory()
194         */
195        public String getDefaultPrefs() {
196            return defaultPrefs;
197        }
198        
199        /**
200         * Returns the platform's notion of a new line.
201         * 
202         * @return Unix-like: {@literal \n}; Windows: {@literal \r\n}.
203         */
204        public String getNewLine() {
205            return newLine;
206        }
207        
208        /**
209         * Returns a brief summary of the platform specific file locations. 
210         * Please note that the format and contents are subject to change.
211         * 
212         * @return String that looks like 
213         * {@code [Platform@HASHCODE: defaultPrefs=..., userDirectory=..., 
214         * userPrefs=...]}
215         */
216        @Override public String toString() {
217            return String.format(
218                "[Platform@%x: defaultPrefs=%s, userDirectory=%s, userPrefs=%s]",
219                hashCode(), defaultPrefs, userDirectory, userPrefs);
220        }
221    }