use of org.lucee.extension.resource.s3.info.ParentObject in project extension-s3 by lucee.
the class S3 method get.
public S3Info get(String bucketName, final String objectName) throws S3Exception {
if (Util.isEmpty(objectName)) {
return get(bucketName);
}
bucketName = improveBucketName(bucketName);
String nameFile = improveObjectName(objectName, false);
String nameDir = improveObjectName(objectName, true);
// cache
S3Info info = cacheTimeout <= 0 ? null : exists.get(toKey(bucketName, nameFile));
if (info != null && info.validUntil() >= System.currentTimeMillis()) {
if (info instanceof NotExisting)
return null;
return info;
}
info = null;
AmazonS3Client client = getAmazonS3(bucketName, null);
try {
long validUntil = System.currentTimeMillis() + cacheTimeout;
ObjectListing objects = null;
try {
ListObjectsRequest lor = new ListObjectsRequest();
lor.setBucketName(bucketName);
lor.setPrefix(nameFile);
lor.setMaxKeys(100);
objects = client.listObjects(lor);
} catch (Exception e) {
if (log != null)
log.error("s3", e);
else
e.printStackTrace();
}
/* Recursively delete all the objects inside given bucket */
if (objects == null || objects.getObjectSummaries() == null || objects.getObjectSummaries().size() == 0) {
// we do not return this, we just store it to cache that it
exists.put(toKey(bucketName, objectName), new NotExisting(bucketName, objectName, validUntil, log));
// does
return null;
}
String targetName;
S3ObjectSummary stoObj = null;
int count = 0;
// while (true) {
for (S3ObjectSummary summary : objects.getObjectSummaries()) {
count++;
// direct match
targetName = summary.getKey();
if (nameFile.equals(targetName) || nameDir.equals(targetName)) {
exists.put(toKey(bucketName, nameFile), info = new StorageObjectWrapper(this, stoObj = summary, validUntil, log));
}
// pseudo directory?
// if (info == null) {
targetName = summary.getKey();
if (nameDir.length() < targetName.length() && targetName.startsWith(nameDir)) {
exists.put(toKey(bucketName, nameFile), info = new ParentObject(this, bucketName, nameDir, validUntil, log));
}
// set the value to exist when not a match
if (!(stoObj != null && stoObj.equals(summary))) {
exists.put(toKey(summary.getBucketName(), summary.getKey()), new StorageObjectWrapper(this, summary, validUntil, log));
}
// set all the parents when not exist
// TODO handle that also a file with that name can exist at the same time
String parent = nameFile;
int index;
while ((index = parent.lastIndexOf('/')) != -1) {
parent = parent.substring(0, index);
exists.put(toKey(bucketName, parent), new ParentObject(this, bucketName, parent, validUntil, log));
}
}
// }
if (info == null) {
// we do not return this, we just store it to cache that it does
exists.put(// we do not return this, we just store it to cache that it does
toKey(bucketName, objectName), // we do not return this, we just store it to cache that it does
new NotExisting(bucketName, objectName, validUntil, log));
}
return info;
} catch (AmazonServiceException ase) {
throw toS3Exception(ase);
} finally {
client.release();
}
}
use of org.lucee.extension.resource.s3.info.ParentObject in project extension-s3 by lucee.
the class S3 method add.
private void add(Map<String, S3Info> map, S3Info info, String prefix, boolean recursive, boolean addPseudoEntries, boolean onlyChildren) throws S3Exception {
String nameFile = improveObjectName(info.getObjectName(), false);
int index, last = 0;
ParentObject tmp;
String objName;
S3Info existing;
if (addPseudoEntries) {
while ((index = nameFile.indexOf('/', last)) != -1) {
tmp = new ParentObject(this, nameFile.substring(0, index + 1), info, log);
if (doAdd(tmp, prefix, recursive, onlyChildren)) {
objName = improveObjectName(tmp.getObjectName(), false);
existing = map.get(objName);
if (existing == null) {
map.put(objName, tmp);
}
}
last = index + 1;
}
}
if (doAdd(info, prefix, recursive, onlyChildren)) {
objName = improveObjectName(info.getObjectName(), false);
existing = map.get(objName);
if (existing == null || existing instanceof ParentObject)
map.put(objName, info);
}
}
use of org.lucee.extension.resource.s3.info.ParentObject in project extension-s3 by lucee.
the class S3 method _list.
private ValidUntilMap<S3Info> _list(String bucketName, String objectName, boolean onlyChildren, boolean noCache) throws S3Exception {
try {
String key = toKey(bucketName, objectName);
String nameDir = improveObjectName(objectName, true);
String nameFile = improveObjectName(objectName, false);
boolean hasObjName = !Util.isEmpty(objectName);
// not cached
ValidUntilMap<S3Info> _list = cacheTimeout <= 0 || noCache ? null : objects.get(key);
if (_list == null || _list.validUntil < System.currentTimeMillis()) {
long validUntil = System.currentTimeMillis() + cacheTimeout;
_list = new ValidUntilMap<S3Info>(validUntil);
objects.put(key, _list);
// add bucket
if (!hasObjName && !onlyChildren) {
outer: while (true) {
AmazonS3Client client = getAmazonS3(null, null);
try {
for (Bucket b : client.listBuckets()) {
// TOD is there a more direct way?
if (b.getName().equals(bucketName)) {
_list.put("", new S3BucketWrapper(this, b, validUntil, log));
break outer;
}
}
} finally {
client.release();
}
// should never happen!
throw new S3Exception("could not find bucket [" + bucketName + "]");
}
}
AmazonS3Client client = getAmazonS3(bucketName, null);
ObjectListing list = (hasObjName ? client.listObjects(bucketName, nameFile) : client.listObjects(bucketName));
try {
if (list != null && list.getObjectSummaries() != null) {
while (true) {
List<S3ObjectSummary> kids = list.getObjectSummaries();
StorageObjectWrapper tmp;
String name;
for (S3ObjectSummary kid : kids) {
name = kid.getKey();
tmp = new StorageObjectWrapper(this, kid, validUntil, log);
if (!hasObjName || name.equals(nameFile) || name.startsWith(nameDir))
_list.put(kid.getKey(), tmp);
exists.put(toKey(kid.getBucketName(), name), tmp);
int index;
while ((index = name.lastIndexOf('/')) != -1) {
name = name.substring(0, index);
exists.put(toKey(bucketName, name), new ParentObject(this, bucketName, name, validUntil, log));
}
}
if (list.isTruncated()) {
list = client.listNextBatchOfObjects(list);
} else {
break;
}
}
}
} finally {
client.release();
}
}
return _list;
} catch (AmazonS3Exception ase) {
throw toS3Exception(ase);
}
}
Aggregations