/** * Get the relative path between two virtual files * * @param context the structure context * @param child the child * @return the relative path */ public static String getRelativePath(StructureContext context, VirtualFile child) { if (context == null) throw new IllegalArgumentException("Null context"); return getRelativePath(context.getParent(), child); }
/** * Is the current context already part of metadata path. * * @param context the current structure context * @return true if already part of parent's context metadata path */ protected boolean isMetadataPath(StructureContext context) { StructureContext parentContext = context.getParentContext(); if (parentContext == null) return false; StructureMetaData smd = parentContext.getMetaData(); ContextInfo info = smd.getContext(""); List<MetaDataEntry> metadataPaths = info.getMetaDataPath(); if (metadataPaths != null && metadataPaths.isEmpty() == false) { String relativePath = AbstractStructureDeployer.getRelativePath(context.getParent(), context.getFile()); for (MetaDataEntry entry : metadataPaths) if (relativePath.equalsIgnoreCase(entry.getPath())) return true; } return false; } }
public boolean determineStructure(VirtualFile file, StructureContext parentContext) throws DeploymentException { StructureMetaData structure = StructureMetaDataFactory.createStructureMetaData(); StructureContext context = new StructureContext(file, structure, parentContext); boolean result = doDetermineStructure(context); if (result) { String relativePath = AbstractStructureDeployer.getRelativePath(context.getParent(), file); // Something said it recognised it ContextInfo recognised = structure.getContext(""); if (recognised == null) throw new IllegalStateException("Something recognised the deployment, but there is no context? " + file); // Create the context in the parent structure ContextInfo parentContextInfo; List<MetaDataEntry> metaDataPath = recognised.getMetaDataPath(); if (metaDataPath == null || metaDataPath.isEmpty()) parentContextInfo = StructureMetaDataFactory.createContextInfo(relativePath, recognised.getClassPath()); else parentContextInfo = StructureMetaDataFactory.createContextInfo(recognised.getClassPath(), metaDataPath, relativePath); // copy the modification type information parentContextInfo.setModificationType(recognised.getModificationType()); StructureMetaData structureMetaData = parentContext.getMetaData(); structureMetaData.addContext(parentContextInfo); MutableAttachments attachments = (MutableAttachments) parentContextInfo.getPredeterminedManagedObjects(); attachments.addAttachment(StructureMetaData.class, structure); } return result; }