18
18
import com .google .common .collect .ImmutableList ;
19
19
import com .spectralogic .ds3client .metadata .jna .Advapi32 ;
20
20
import com .spectralogic .ds3client .networking .Metadata ;
21
+ import com .spectralogic .ds3client .utils .Guard ;
21
22
import com .sun .jna .platform .win32 .WinNT ;
23
+ import org .slf4j .Logger ;
24
+ import org .slf4j .LoggerFactory ;
25
+
22
26
import java .io .File ;
23
27
import java .io .IOException ;
24
28
import java .nio .file .FileSystems ;
36
40
import static com .spectralogic .ds3client .metadata .MetadataKeyConstants .KEY_OWNER ;
37
41
38
42
class WindowsMetadataRestore extends AbstractMetadataRestore {
43
+
44
+ private static final Logger LOG = LoggerFactory .getLogger (WindowsMetadataRestore .class );
45
+
39
46
WindowsMetadataRestore (final Metadata metadata , final String filePath , final String localOS ) {
40
47
this .metadata = metadata ;
41
48
this .objectName = filePath ;
@@ -44,26 +51,31 @@ class WindowsMetadataRestore extends AbstractMetadataRestore {
44
51
45
52
@ Override
46
53
public void restoreUserAndOwner () throws IOException {
47
- if (storedOS .equals (localOS )) {
48
- String ownerSid = null ;
49
- if (metadata .get (KEY_OWNER ).size () > 0 ) {
50
- ownerSid = metadata .get (KEY_OWNER ).get (0 );
51
- }
52
- String groupSid = null ;
53
- if (metadata .get (KEY_GROUP ).size () > 0 ) {
54
- groupSid = metadata .get (KEY_GROUP ).get (0 );
55
- }
56
- if (ownerSid != null && groupSid != null && !ownerSid .equals ("" ) && !groupSid .equals ("" )) {
57
- setOwnerIdandGroupId (ownerSid , groupSid );
54
+ if (storedOS != null && storedOS .equals (localOS )) {
55
+
56
+ final String ownerSid = getMetadataProperty (metadata , KEY_OWNER );
57
+ final String groupSid = getMetadataProperty (metadata , KEY_GROUP );
58
+
59
+ if (!Guard .isStringNullOrEmpty (ownerSid ) && !Guard .isStringNullOrEmpty (groupSid )) {
60
+ setOwnerIdAndGroupId (ownerSid , groupSid );
61
+ } else {
62
+ LOG .warn ("Cannot determine owner or group settings for {}" , this .objectName );
58
63
}
64
+ } else {
65
+ LOG .warn ("The OS settings for owner and group properties cannot be restored for {}" , this .objectName );
59
66
}
67
+ }
60
68
69
+ private static String getMetadataProperty (final Metadata metadata , final String metadataName ) {
70
+ return metadata .get (metadataName ).get (0 );
61
71
}
62
72
63
73
@ Override
64
74
public void restorePermissions () throws IOException , InterruptedException {
65
75
if (storedOS != null && storedOS .equals (localOS )) {
66
76
setPermissionsForWindows ();
77
+ } else {
78
+ LOG .warn ("The OS settings for the file permissions cannot be restored for {}" , this .objectName );
67
79
}
68
80
restoreFlags ();
69
81
}
@@ -76,19 +88,26 @@ private void setPermissionsForWindows() throws IOException {
76
88
final String userListDisplay ;
77
89
final String [] users ;
78
90
final String [] usersDisplay ;
79
- if (metadata .get ("ds3-userList" ). size () > 0 ) {
91
+ if (Guard . isNotNullAndNotEmpty ( metadata .get ("ds3-userList" )) ) {
80
92
userList = metadata .get ("ds3-userList" ).get (0 );
81
- if (metadata .get ("ds3-userListDisplay" ). size () > 0 ) {
93
+ if (Guard . isNotNullAndNotEmpty ( metadata .get ("ds3-userListDisplay" )) ) {
82
94
userListDisplay = metadata .get ("ds3-userListDisplay" ).get (0 );
83
95
users = userList .split ("-" );
84
96
usersDisplay = userListDisplay .split ("-" );
85
97
for (int i = 0 ; i < users .length ; i ++) {
86
- if (metadata .get ("ds3-" + users [i ]).size () > 0 ) {
87
- final String ownerPermission = metadata .get ("ds3-" + users [i ]).get (0 );
98
+ final String user = users [i ];
99
+ if (Guard .isNotNullAndNotEmpty (metadata .get ("ds3-" + user ))) {
100
+ final String ownerPermission = metadata .get ("ds3-" + user ).get (0 );
88
101
restorePermissionByUser (ownerPermission , usersDisplay [i ], aclEntryBuilder );
102
+ } else {
103
+ LOG .warn ("Did not find any permissions for {} for file {}" , user , this .objectName );
89
104
}
90
105
}
106
+ } else {
107
+ LOG .warn ("There was not a 'userListDisplay' metadata entry for file {}, so we will not restore any permissions" , this .objectName );
91
108
}
109
+ } else {
110
+ LOG .warn ("There was not a 'userList' metadata entry for file {}, so we will not restore any permissions" , this .objectName );
92
111
}
93
112
94
113
aclAttributeView .setAcl (aclEntryBuilder .build ());
@@ -148,7 +167,7 @@ private void restorePermissionByUser(final String permission,
148
167
* @param ownerSidId sid of the owner
149
168
* @param groupSidId sid of the group
150
169
*/
151
- private void setOwnerIdandGroupId (final String ownerSidId , final String groupSidId ) throws IOException {
170
+ private void setOwnerIdAndGroupId (final String ownerSidId , final String groupSidId ) throws IOException {
152
171
final int infoType = WinNT .OWNER_SECURITY_INFORMATION | WinNT .GROUP_SECURITY_INFORMATION ;
153
172
final WinNT .PSIDByReference referenceOwner = new WinNT .PSIDByReference ();
154
173
Advapi32 .INSTANCE .ConvertStringSidToSid (ownerSidId , referenceOwner );
@@ -166,7 +185,11 @@ private void restoreFlags() throws IOException, InterruptedException {
166
185
if (metadata .get (KEY_FLAGS ).size () > 0 ) {
167
186
final String flags = metadata .get (KEY_FLAGS ).get (0 );
168
187
restoreFlagsWindows (flags );
188
+ } else {
189
+ LOG .warn ("The file flag settings do not exist for file {} and will not be restored" , this .objectName );
169
190
}
191
+ } else {
192
+ LOG .warn ("The OS settings for restoring the file flags cannot be done for {}" , this .objectName );
170
193
}
171
194
}
172
195
@@ -199,9 +222,12 @@ private void restoreFlagsWindows(final String flag) throws IOException, Interrup
199
222
stringBuilder .append (" -I" );
200
223
stringBuilder .append (" -H" );
201
224
}
202
- stringBuilder .append (" " + "\" " + objectName + "\" " );
225
+ stringBuilder .append (" " + "\" " ). append ( objectName ). append ( "\" " );
203
226
204
227
final Process p = Runtime .getRuntime ().exec (stringBuilder .toString ().split (" " ));
205
- p .waitFor ();
228
+ final int returnCode = p .waitFor ();
229
+ if (returnCode != 0 ) {
230
+ LOG .error ("Restoring the flag settings for file {} was not successful" , this .objectName );
231
+ }
206
232
}
207
233
}
0 commit comments