use of org.mycore.frontend.cli.annotation.MCRCommand in project mycore by MyCoRe-Org.
the class MCRMigrationCommands method addServFlags.
@MCRCommand(syntax = "migrate author servflags for {0}", help = "Create missing servflags for createdby and modifiedby for object {0}. (MCR-786)", order = 10)
public static void addServFlags(String id) throws IOException, MCRPersistenceException, MCRActiveLinkException, MCRAccessException {
MCRObjectID objectID = MCRObjectID.getInstance(id);
MCRBase obj = MCRMetadataManager.retrieve(objectID);
MCRObjectService service = obj.getService();
if (!service.isFlagTypeSet(MCRObjectService.FLAG_TYPE_CREATEDBY)) {
// the egg
MCRVersionedMetadata versionedMetadata = MCRXMLMetadataManager.instance().getVersionedMetaData(objectID);
String createUser = null, modifyUser = null;
if (versionedMetadata == null) {
LOGGER.warn("Cannot restore author servflags as there are no versions available. Setting to current user.");
createUser = MCRSessionMgr.getCurrentSession().getUserInformation().getUserID();
modifyUser = createUser;
} else {
List<MCRMetadataVersion> versions = versionedMetadata.listVersions();
MCRMetadataVersion firstVersion = versions.get(0);
for (MCRMetadataVersion version : versions) {
if (version.getType() == 'A') {
// get last 'added'
firstVersion = version;
}
}
MCRMetadataVersion lastVersion = versions.get(versions.size() - 1);
createUser = firstVersion.getUser();
modifyUser = lastVersion.getUser();
}
service.addFlag(MCRObjectService.FLAG_TYPE_CREATEDBY, createUser);
LOGGER.info("{}, created by: {}", objectID, createUser);
if (!service.isFlagTypeSet(MCRObjectService.FLAG_TYPE_MODIFIEDBY)) {
// the chicken
// have to restore also modifiedby from version history.
LOGGER.info("{}, modified by: {}", objectID, modifyUser);
service.addFlag(MCRObjectService.FLAG_TYPE_CREATEDBY, modifyUser);
}
obj.setImportMode(true);
if (obj instanceof MCRDerivate) {
MCRMetadataManager.updateMCRDerivateXML((MCRDerivate) obj);
} else {
MCRMetadataManager.update((MCRObject) obj);
}
}
}
use of org.mycore.frontend.cli.annotation.MCRCommand in project mycore by MyCoRe-Org.
the class MCRMigrationCommands method fixDerivateLinks.
@MCRCommand(syntax = "fix invalid derivate links {0} for {1}", help = "Fixes the paths of all derivate links " + "({0} -> xpath -> e.g. /mycoreobject/metadata/derivateLinks/derivateLink) for object {1}. (MCR-1267)", order = 15)
public static void fixDerivateLinks(String xpath, String id) throws IOException, JDOMException, SAXException {
// get mcr object
MCRObjectID objectID = MCRObjectID.getInstance(id);
// find derivate links
Document xml = MCRXMLMetadataManager.instance().retrieveXML(objectID);
Element mcrObjectXML = xml.getRootElement();
XPathExpression<Element> expression = XPathFactory.instance().compile(xpath, Filters.element());
List<Element> derivateLinkElements = expression.evaluate(mcrObjectXML);
// check them
boolean changedObject = false;
for (Element derivateLinkElement : derivateLinkElements) {
String href = derivateLinkElement.getAttributeValue("href", MCRConstants.XLINK_NAMESPACE);
MCRMetaDerivateLink link = new MCRMetaDerivateLink();
link.setReference(href, null, null);
String owner = link.getOwner();
try {
String path = link.getPath();
MCRPath mcrPath = MCRPath.getPath(owner, path);
if (!Files.exists(mcrPath)) {
// -> e.g. a?c.tif -> path (a), query (c.tif) which is obvious wrong
if (tryRawPath(objectID, derivateLinkElement, href, link, owner)) {
changedObject = true;
} else {
LOGGER.warn("{} of {}cannot be found on file system. This is most likly a dead link.", href, objectID);
}
}
} catch (URISyntaxException uriExc) {
// not encoded properly
if (tryRawPath(objectID, derivateLinkElement, href, link, owner)) {
changedObject = true;
} else {
LOGGER.warn("{} of {} isn't URI encoded and cannot be found on file system. This is most likly a dead link.", href, objectID);
}
}
}
// store the mcr object if its changed
if (changedObject) {
// we use MCRXMLMetadataMananger because we don't want to validate the old mcr object
MCRXMLMetadataManager.instance().update(objectID, xml, new Date());
// manually fire update event
MCRObject newObject = MCRMetadataManager.retrieveMCRObject(objectID);
newObject.setImportMode(true);
MCRMetadataManager.fireUpdateEvent(newObject);
}
}
use of org.mycore.frontend.cli.annotation.MCRCommand in project mycore by MyCoRe-Org.
the class MCRMigrationCommands method fixMissingChildren.
@MCRCommand(syntax = "add missing children to {0}", help = "Adds missing children to structure of parent {0}. (MCR-1480)", order = 15)
public static void fixMissingChildren(String id) throws IOException, JDOMException, SAXException {
MCRObjectID parentId = MCRObjectID.getInstance(id);
Collection<String> children = MCRLinkTableManager.instance().getSourceOf(parentId, MCRLinkTableManager.ENTRY_TYPE_PARENT);
if (children.isEmpty()) {
return;
}
MCRObject parent = MCRMetadataManager.retrieveMCRObject(parentId);
MCRObjectStructure parentStructure = parent.getStructure();
int sizeBefore = parentStructure.getChildren().size();
children.stream().map(MCRObjectID::getInstance).filter(cid -> !parentStructure.getChildren().stream().anyMatch(candidate -> candidate.getXLinkHrefID().equals(cid))).sorted().map(MCRMigrationCommands::toLinkId).sequential().peek(lid -> LOGGER.info("Adding {} to {}", lid, parentId)).forEach(parentStructure::addChild);
if (parentStructure.getChildren().size() != sizeBefore) {
MCRMetadataManager.fireUpdateEvent(parent);
}
}
use of org.mycore.frontend.cli.annotation.MCRCommand in project mycore by MyCoRe-Org.
the class MCRMODSCommands method loadFromDirectory.
@MCRCommand(syntax = "load all mods documents from directory {0} for project {1}", help = "Load all MODS documents as MyCoRe Objects for project {1} from directory {0}", order = 10)
public static List<String> loadFromDirectory(String directory, String projectID) {
File dir = new File(directory);
if (!dir.isDirectory()) {
throw new MCRException(MessageFormat.format("File {0} is not a directory.", directory));
}
String[] list = dir.list();
if (list.length == 0) {
LOGGER.warn("No files found in directory {}", dir);
return null;
}
return Arrays.stream(list).filter(file -> file.endsWith(".xml")).map(file -> MessageFormat.format("load mods document from file {0} for project {1}", new File(dir, file).getAbsolutePath(), projectID)).collect(Collectors.toList());
}
use of org.mycore.frontend.cli.annotation.MCRCommand in project mycore by MyCoRe-Org.
the class MCRSolrCommands method rebuildMetadataIndexForObject.
@MCRCommand(syntax = "restricted rebuild solr metadata index for object {0}", help = "rebuilds solr's metadata index for object and all its children", order = 70)
public static void rebuildMetadataIndexForObject(String id) {
MCRObject mcrObject = MCRMetadataManager.retrieveMCRObject(MCRObjectID.getInstance(id));
List<MCRObject> objectList = MCRObjectUtils.getDescendantsAndSelf(mcrObject);
List<String> idList = objectList.stream().map(obj -> obj.getId().toString()).collect(Collectors.toList());
MCRSolrIndexer.rebuildMetadataIndex(idList);
}
Aggregations