baseURI = content.getBaseURI();
}
if (entries!=null) {
entries.add(entryId);
}
Entry entry = null;
try {
entry = feed.findEntry(entryId);
} catch (SQLException ex) {
log.log(Level.SEVERE,"Cannot find entry "+entryId+" due to exception.",ex);
errorCount++;
}
EntryMedia resource = null;
boolean hasMedia = false;
if (entry!=null) {
try {
Iterator<EntryMedia> resources = entry.getResources();
if (resources.hasNext()) {
hasMedia = true;
while (resources.hasNext()) {
resource = resources.next();
if (!resource.getName().equals(src)) {
resource = null;
}
}
}
} catch (SQLException ex) {
log.log(Level.SEVERE,"Cannot enumerate entry "+index.getId()+" media due to exception.",ex);
errorCount++;
}
}
if (entry==null || (src!=null && !hasMedia) || (hasMedia && src==null)) {
if (entry!=null) {
// delete the entry because it changed to have a media or non-media content (rare)
try {
app.deleteEntry(feed,entry);
} catch (AppException ex) {
if (ex.getStatus()==Status.SERVER_ERROR_INTERNAL) {
log.log(Level.SEVERE,ex.getMessage(),ex);
} else {
log.severe("Status="+ex.getStatus().getCode()+", "+ex.getMessage());
}
errorCount++;
return;
}
}
if (src==null) {
// we have a regular entry
try {
app.createEntry(user,feed,entryDoc);
} catch (AppException ex) {
log.severe("Failed to create entry "+index.getId());
if (ex.getStatus()==Status.SERVER_ERROR_INTERNAL) {
log.log(Level.SEVERE,ex.getMessage(),ex);
} else {
log.severe("Status="+ex.getStatus().getCode()+", "+ex.getMessage());
}
errorCount++;
}
} else {
try {
EntryMedia media = feed.findEntryResource(src);
if (media!=null) {
// We have a conflicting media entry. We'll delete
// the local one to use the pulled one
Entry otherEntry = media.getEntry();
final String fpath = feed.getPath();
otherEntry.delete(new MediaEntryListener() {
public void onDelete(EntryMedia resource) {
try {
storage.deleteMedia(fpath,feed.getUUID(),resource.getName());
} catch (IOException ex) {
log.log(Level.SEVERE,"Cannot delete media "+resource.getName(),ex);
}
}
});
storage.deleteEntry(fpath,feed.getUUID(),otherEntry.getUUID());
}
} catch (SQLException ex) {
log.log(Level.SEVERE,"Database error while processing local media reference "+src,ex);
} catch (IOException ex) {
log.log(Level.SEVERE,"I/O error while deleting entry for media "+src,ex);
}
// we have a media entry
URI srcRef = baseURI.resolve(src);
Client client = new Client(new Context(log),Protocol.valueOf(srcRef.getScheme()));
client.getContext().getAttributes().put("hostnameVerifier", org.apache.commons.ssl.HostnameVerifier.DEFAULT);
Request request = new Request(Method.GET,new Reference(srcRef.toString()));
if (auth!=null) {
if (auth.getScheme().equals("cookie")) {
Cookie cookie = new Cookie(auth.getName(),auth.getPassword());
cookie.setPath("/");
request.getCookies().add(cookie);
} else {
request.setChallengeResponse(new ChallengeResponse(ChallengeScheme.HTTP_BASIC,auth.getName(),auth.getPassword()));
}
}
Response response = client.handle(request);
if (!response.getStatus().isSuccess()) {
log.log(Level.SEVERE,"Failed to retrieve media, status="+response.getStatus().getCode()+", src="+srcRef);
errorCount++;
return;
}
if (contentType!=null) {
// The entry's media type wins. Sometimes file resources do not
// report the media type correctly
response.getEntity().setMediaType(contentType);
}
try {
entry = app.createMediaEntry(user,feed,response.getEntity(),src,entryId);
app.updateEntry(user,feed,entry,entryDoc);
} catch (AppException ex) {
log.severe("Failed to create media entry "+index.getId()+", src="+srcRef);
if (ex.getStatus()==Status.SERVER_ERROR_INTERNAL) {
log.log(Level.SEVERE,ex.getMessage(),ex);
} else {
log.severe("Status="+ex.getStatus().getCode()+", "+ex.getMessage());
}
errorCount++;
}
}
} else {
try {
app.updateEntry(user,feed,entryId,entryDoc);
} catch (AppException ex) {
if (ex.getStatus()==Status.SERVER_ERROR_INTERNAL) {
log.log(Level.SEVERE,ex.getMessage(),ex);
} else {
log.severe("Status="+ex.getStatus().getCode()+", "+ex.getMessage());
}
errorCount++;
return;
}
if (src!=null) {
URI srcRef = baseURI.resolve(src);
Client client = new Client(new Context(log),Protocol.valueOf(srcRef.getScheme()));
client.getContext().getAttributes().put("hostnameVerifier", org.apache.commons.ssl.HostnameVerifier.DEFAULT);
/*
Request headRequest = new Request(Method.HEAD,new Reference(srcRef.toString()));
if (auth!=null) {
headRequest.setChallengeResponse(new ChallengeResponse(ChallengeScheme.HTTP_BASIC,auth.getName(),auth.getPassword()));
}
Response headResponse = client.handle(headRequest);
if (!headResponse.getStatus().isSuccess()) {
log.log(Level.SEVERE,"Failed to retrieve media head, status="+headResponse.getStatus().getCode()+", src="+srcRef);
errorCount++;
return;
}
boolean outOfDate = true;
if (headResponse.isEntityAvailable()) {
outOfDate = headResponse.getEntity().getModificationDate().after(resource.getEdited());
if (outOfDate) {
log.info("Out of date: "+headResponse.getEntity().getModificationDate()+" > "+resource.getEdited());
}
}
*/
Request request = new Request(Method.GET,new Reference(srcRef.toString()));
if (auth!=null) {
if (auth.getScheme().equals("cookie")) {
Cookie cookie = new Cookie(auth.getName(),auth.getPassword());
cookie.setPath("/");
request.getCookies().add(cookie);
} else {
request.setChallengeResponse(new ChallengeResponse(ChallengeScheme.HTTP_BASIC,auth.getName(),auth.getPassword()));
}
}
Date edited = new Date(resource.getEdited().getTime());
request.getConditions().setUnmodifiedSince(edited);
log.info("Attempting update media from "+srcRef.toString()+", edited="+edited);
Response response = client.handle(request);
if (response.getStatus().getCode()==304) {
log.info("No change (304)");
return;
} else if (!response.getStatus().isSuccess()) {
log.log(Level.SEVERE,"Failed to retrieve media, status="+response.getStatus().getCode()+", src="+srcRef);
errorCount++;
return;
}
if (contentType!=null) {
// The entry's media type wins. Sometimes file resources do not
// report the media type correctly
response.getEntity().setMediaType(contentType);
}
try {
app.updateMedia(feed,src,response.getEntity());
} catch (AppException ex) {
if (ex.getStatus()==Status.SERVER_ERROR_INTERNAL) {
log.log(Level.SEVERE,ex.getMessage(),ex);
} else {
log.severe("Failed to update media entry "+index.getId()+", src="+srcRef);
log.severe("Status="+ex.getStatus().getCode()+", "+ex.getMessage());
}
errorCount++;
}
}
}
}
public void onEnd() {
if (additive) {
return;
}
if (feed!=null) {
log.info("Removing extra entries...");
try {
Iterator<Entry> feedEntries = feed.getEntries();
while (feedEntries.hasNext()) {
Entry entry = feedEntries.next();
//log.info(entry.getUUID()+"?");
if (!entries.contains(entry.getUUID())) {
log.info("Delete ");
app.deleteEntry(feed, entry);
}
}
} catch (Exception ex) {