001: /*
002: * Gruntspud
003: *
004: * Copyright (C) 2002 Brett Smith.
005: *
006: * Written by: Brett Smith <t_magicthize@users.sourceforge.net>
007: *
008: * This program is free software; you can redistribute it and/or
009: * modify it under the terms of the GNU Library General Public License
010: * as published by the Free Software Foundation; either version 2 of
011: * the License, or (at your option) any later version.
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU Library General Public License for more details.
016: *
017: * You should have received a copy of the GNU Library General Public
018: * License along with this program; if not, write to the Free Software
019: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
020: */
021:
022: package gruntspud.file;
023:
024: import gruntspud.Constants;
025:
026: import java.io.*;
027: import org.netbeans.lib.cvsclient.util.*;
028:
029: /**
030: * This implementation of a <code>FileModeHandler</code> will only work on
031: * Unix like machines that have the <strong>chmod</strong> and <strong>ls</code>
032: * commands available.
033: *
034: * @author Brett Smith
035: * @version Jul 24, 2002
036: */
037: public class UnixFileModeHandler implements FileModeHandler {
038: // Implemented ============================================================
039:
040: /**
041: * Set the <code>FileMode</code> for a given <code>File</code>
042: *
043: * @param file the file to perform the operation on
044: * @param fileMode the FileMode object providing what permissions to set
045: * @throws IOException if something gone wrong
046: */
047: public void setFileMode(File file, GruntspudFileMode fileMode)
048: throws IOException {
049: if (file == null) {
050: throw new IllegalArgumentException("file must not be null"); // NOI18N
051: }
052: if (fileMode == null) {
053: throw new IllegalArgumentException(
054: "fileMode must not be null"); // NOI18N
055: }
056:
057: // We only ever need to set the user file permissions as CVS **seems** to
058: // only send back the correct permissions for this one. Is this something
059: // to do with the CVSRoot/config paramter 'PreservePermissions'
060: Process process = null;
061: try {
062: String[] arguments = { "chmod", // NOI18N
063: fileMode.toString(), file.getName() };
064: process = Runtime.getRuntime().exec(arguments, null,
065: file.getParentFile());
066:
067: // Watch both the streams for any output that may get produced.
068: new StreamSink(process.getInputStream(), false);
069: new StreamSink(process.getErrorStream(), true);
070:
071: //
072: process.waitFor();
073: } catch (InterruptedException ex) {
074: BugLog.getInstance().showException(ex);
075: }
076: }
077:
078: /**
079: * Return the <code>FileMode</code> for a given <code>
080: *
081: * @param file the file to get the permissions for
082: * @return mode the file mode for this file
083: * @throws IOException if something goes wronge
084: */
085: public GruntspudFileMode getFileMode(File file) throws IOException {
086:
087: if (file == null) {
088: throw new IllegalArgumentException("file must not be null"); // NOI18N
089: }
090:
091: GruntspudFileMode mode = new GruntspudFileMode();
092: if (!file.exists())
093: return mode;
094:
095: Process process = null;
096: BufferedReader reader = null;
097: try {
098: String[] arguments = { "ls", // NOI18N
099: "-ld", // NOI18N
100: file.getAbsolutePath() };
101: process = Runtime.getRuntime().exec(arguments, null,
102: file.getParentFile());
103: new StreamSink(process.getErrorStream(), true);
104: reader = new BufferedReader(new InputStreamReader(process
105: .getInputStream()));
106: String s = null;
107: while (true) {
108: String z = reader.readLine();
109: if (z == null) {
110: break;
111: }
112: s = z;
113: }
114: if (s == null || s.length() < 10)
115: throw new IOException(
116: "ls command responded unexpectedly");
117: mode.setPermission(GruntspudFileMode.USER_FILE_MODE_TYPE,
118: GruntspudFileMode.getPermissionsForString(s
119: .substring(1, 4)));
120: mode.setPermission(GruntspudFileMode.GROUP_FILE_MODE_TYPE,
121: GruntspudFileMode.getPermissionsForString(s
122: .substring(4, 7)));
123: mode.setPermission(GruntspudFileMode.OTHER_FILE_MODE_TYPE,
124: GruntspudFileMode.getPermissionsForString(s
125: .substring(7, 10)));
126: return mode;
127: } catch (Exception e) {
128: Constants.SYSTEM_LOG.error(e);
129: return mode;
130: } finally {
131: if (reader != null)
132: reader.close();
133: }
134: }
135:
136: class StreamSink extends Thread {
137:
138: StreamSink(InputStream in, boolean err) {
139: this .in = in;
140: this .err = err;
141: start();
142: }
143:
144: public void run() {
145: try {
146: while (true) {
147: int a = in.available();
148: if (a == -1)
149: break;
150: if (a == 0)
151: a = 1;
152: byte[] buf = new byte[a];
153: int z = in.read(buf);
154: if (z == -1)
155: break;
156: if (err)
157: System.err.println(new String(buf, 0, z));
158: else
159: System.out.println(new String(buf, 0, z));
160: }
161: } catch (IOException ioe) {
162: } finally {
163: try {
164: in.close();
165: } catch (IOException ioe) {
166: }
167: }
168: }
169:
170: InputStream in;
171: boolean err;
172: }
173: }
|