private LinkTarget buildLinkTarget(Resolvable<?, ?> resolvable, boolean endsOnSlash) { StringBuilder hrefBuilder = new StringBuilder(); LabelSwitch labelSwitch = new LabelSwitch(getLocale()); StringBuilder name = new StringBuilder(); name.append(labelSwitch.doSwitch(resolvable)); if (resolvable.getParent() == null) hrefBuilder.append("/"); else if (resolvable.getParent() instanceof Workspace) hrefBuilder.append(endsOnSlash ? resolvable.getName() : "workspace/" + resolvable.getName()); else hrefBuilder.append(endsOnSlash ? resolvable.getName() : resolvable.getParent().getName() + "/" + resolvable.getName()); Resolvable<?, ?> folder = resolvable; if(folder instanceof ResourceFolder) { // if it is a folder, squash more children, if there is only one while (folder.getChildren().size() == 1) { folder = folder.getChildren().get(0); hrefBuilder.append("/"); hrefBuilder.append(folder.getName()); name.append("/"); name.append(labelSwitch.doSwitch(folder)); } } LinkTarget target = new LinkTarget(Model.of(name.toString()),hrefBuilder.toString(),folder); return target; }
@Override public <P extends Resolvable<?, ?>, C extends Resolvable<?, ?>> IModel<String> caseResolvable(Resolvable<P, C> object) { return new StringResourceModel(TRANSLATION_PERCENTAGE_SHORT_KEY, parent, null, object.getPercentComplete()); }
/** * called when the name of a resolvable changes * @param oldName * @param model */ @SuppressWarnings("rawtypes") protected void renameResolvable(String oldName, IModel<T> model) { T object = model.getObject(); if (object instanceof Resolvable) { Resolvable r = (Resolvable) object; logger.info("Renaming {} {} to {}",r.getClass().getSimpleName(), oldName, r.getName()); URI absoluteFilePath = r.absoluteFilePath(); String fileString = absoluteFilePath.toFileString(); if(!fileString.startsWith("/") || fileString.startsWith("\\")) { fileString = "/"+fileString; } File targetFile = new File(fileString); File sourceFile = new File(targetFile.getParentFile(),oldName); sourceFile.renameTo(targetFile); } }
/** * computes something known to us that we can use to construct a proper permission. * e.g. we don't have permissions on per descriptor level, so we need to walk up the * hierarchy until we find something known * @param target * @return */ private static Resolvable<?, ?> getActualTarget(Resolvable<?, ?> target) { Resolvable<?, ?> current = target; while(current!=null && !KNOWN_TARGETS.contains(current.eClass())) current = current.getParent(); return current; }
@SuppressWarnings({ "unchecked", "rawtypes" }) private Resolvable<?, Resolvable<?, ?>> getOrCreate(Resolvable<?, Resolvable<?, ?>> currentParent, String child) { Resolvable<?, Resolvable<?, ?>> childObject = (Resolvable<?, Resolvable<?, ?>>) currentParent.getChild(child); if (childObject == null) { childObject = PropertiesFactory.eINSTANCE.createResourceFolder(); childObject.setName(child); EList children = currentParent.getChildren(); children.add(childObject); } return childObject; }
public static String constructPermissionName(Resolvable<?, ?> r, String action){ Resolvable<?, ?> rightsContainer = getActualTarget(r); if (rightsContainer instanceof Workspace) { // in that case the name pattern is a bit different // TODO: unify it return MessageFormat.format(WORKSPACE_PERMISSION_PATTERN,r.eClass().getName(),action); } return constructPermissionName(rightsContainer.eClass().getName(), rightsContainer.getName(), action); }
@Override public <P extends Resolvable<?, ?>, C extends Resolvable<?, ?>> String caseResolvable(Resolvable<P, C> object) { return object.getName(); }
public static PageParameters buildPageParametersFor(Resolvable<?, ?> r) { PageParameters params = new PageParameters(); Deque<String> segments = new ArrayDeque<String>(); Resolvable<?, ?> part = r; while(part!=null) { String name = part.getName(); if(name!=null) segments.push(name); part = part.getParent(); } int count = 0; for (String string : segments) { params.set(count++, string); } return params; }
/** * deletes a folder (and recursively all parents above) if there's only one child left in it * <p> * this is to clean up no longer needed folders when a descriptor is removed * @param parent */ @SuppressWarnings("rawtypes") private static void deleteFolder(ResourceFolder folder) { Resolvable currentParent = folder; Resolvable lastParent = folder; while(currentParent instanceof ResourceFolder) { if(currentParent.getChildren().size()<=1) { lastParent = currentParent; currentParent = currentParent.getParent(); } else break; } EcoreUtil.remove(lastParent); }
Resolvable child = parent.getChild(descriptorPart[i]); if (child == null) { child = PropertiesFactory.eINSTANCE.createResourceFolder(); child.setName(childName); parent.getChildren().add(child); URI derivedLocation = computeLocaleResourceLocation(locale.getLocale(), version, descriptor.getLocation()); PropertyFileDescriptor translatedDescriptor = (PropertyFileDescriptor) parent.getChild(derivedLocation.lastSegment()); if (translatedDescriptor == null) { translatedDescriptor = PropertiesFactory.eINSTANCE.createPropertyFileDescriptor(); locale.getDescriptors().add(translatedDescriptor); parent.getChildren().add(translatedDescriptor); parent.updatePercentComplete(); else if (parent.getChild(descriptor.getName()) == null) { parent.getChildren().add(descriptor); descriptor.setName(descriptor.getLocation().lastSegment()); version.getTemplate().getDescriptors().add(descriptor);
@Override public Resolvable<?, ?> resolveChild(List<String> pathSegments) { if (pathSegments.isEmpty()) return this; for (C child : getChildren()) { String name = child.getName(); if(name==null) { logger.error("found child with 'null' name during resolve at "+fullPath()); continue; } if (name.equals(URI.decode(pathSegments.get(0)))) return child.resolveChild(pathSegments.subList(1, pathSegments.size())); } return null; }
/** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public ProjectLocale getProjectLocale() { @SuppressWarnings("rawtypes") Resolvable parent = this; while(parent!=null) { if (parent instanceof ProjectLocale) { ProjectLocale locale = (ProjectLocale) parent; return locale; } parent = parent.getParent(); } return null; }
public static void removeDescriptor(PropertyFileDescriptor descriptor) { if (descriptor.isMaster()) { EList<PropertyFileDescriptor> derivedDescriptors = descriptor.getDerivedDescriptors(); for (PropertyFileDescriptor derived : derivedDescriptors) { derived.setProjectLocale(null); Resolvable<?, ?> parent = derived.getParent(); if(parent!=null) { //update the percentage of all derived resources parent.updatePercentComplete(); if(parent.getChildren().size()==1 && parent instanceof ResourceFolder) { deleteFolder((ResourceFolder) parent); } } EcoreUtil.remove(derived); } } else { descriptor.setMaster(null); } Resolvable<?, ?> parent = descriptor.getParent(); if(parent!=null && parent.getChildren().size()==1 && parent instanceof ResourceFolder) deleteFolder((ResourceFolder) parent); EcoreUtil.remove(descriptor); descriptor.getProjectLocale().getDescriptors().remove(descriptor); }
@SuppressWarnings({ "unchecked", "rawtypes" }) public static void addNewLocalizedDescriptor(PropertyFileDescriptor descriptor, ProjectLocale locale) { if (!descriptor.eIsSet(PropertiesPackage.Literals.PROPERTY_FILE_DESCRIPTOR__LOCATION)) throw new IllegalArgumentException("Property File Descriptor location is not set"); ProjectVersion version = locale.getParent(); ProjectLocale templateLocale = version.getTemplate(); URI templateResourceLocation = computeTemplateResourceLocation(locale.getLocale(), descriptor.getLocation(), templateLocale.getLocale(),version); Resolvable<?, ?> resolved = templateLocale.resolveChild(templateResourceLocation); PropertyFileDescriptor template = null; if (resolved instanceof PropertyFileDescriptor) { template = (PropertyFileDescriptor) resolved; } if (template == null) throw new IllegalArgumentException("Template property " + templateResourceLocation + " doesn't exist"); Resolvable container = getOrCreateFolder(locale, descriptor.getLocation().trimSegments(1).segments()); if (container.getChild(descriptor.getLocation().lastSegment()) != null) { PropertyFileDescriptor child = (PropertyFileDescriptor) container.getChild(descriptor.getLocation().lastSegment()); child.setMaster(null); container.getChildren().set(container.getChildren().indexOf(child), descriptor); locale.getDescriptors().remove(child); } else { container.getChildren().add(descriptor); } descriptor.setMaster(template); locale.getDescriptors().add(descriptor); }
@SuppressWarnings("unchecked") private void addChildrenToArchive(ZipOutputStream out, Resolvable<?, ?> parent) throws IOException { EList<Resolvable<?, ?>> children = (EList<Resolvable<?, ?>>) parent.getChildren(); for (Resolvable<?, ?> child : children) { if (child instanceof PropertyFileDescriptor) { PropertyFileDescriptor descriptor = (PropertyFileDescriptor) child; File file = new File(descriptor.absoluteFilePath().path()); if(!file.exists()) continue; out.putNextEntry(new ZipEntry(((PropertyFileDescriptor) child).getLocation().path())); writeFileToStream(file, out); } else addChildrenToArchive(out, child); } }
/** * <!-- begin-user-doc --> <!-- end-user-doc --> * * @generated NOT */ public URI fullPath() { EObject parent = eContainer(); while (parent != null) { if (parent instanceof Resolvable) { Resolvable resolvable = (Resolvable) parent; URI path = relativePath(); if(path!=null) { URI fullParentPath = resolvable.fullPath(); if(fullParentPath!=null) return fullParentPath.appendSegments(path.segments()); return relativePath(); } return resolvable.fullPath(); } } return relativePath(); }
private String getFileName() { return projectVersion.getObject().getName() + ".zip"; } }
@SuppressWarnings({ "rawtypes", "unchecked" }) public static Resolvable<?, ?> getOrCreateFolder(Resolvable<?, ?> parent, String... segments) { Resolvable currentParent = parent; if (segments == null || segments.length==0) return parent; for (String segment : segments) { //in case there was encoded characters in the segment //see https://github.com/jutzig/jabylon/issues/195 segment = URI.decode(segment); Resolvable child = currentParent.getChild(segment); if (child == null) { child = PropertiesFactory.eINSTANCE.createResourceFolder(); child.setName(segment); currentParent.getChildren().add(child); } currentParent = child; } return (ResourceFolder) currentParent; }
@Override public String getRequiredPermission() { Resolvable<?, ?> object = getModelObject(); while(object!=null) { if (object instanceof Project) { return CommonPermissions.constructPermissionName(object, CommonPermissions.ACTION_VIEW); } object = object.getParent(); } return null; }
protected PropertyFileDescriptor createDescriptor(ProjectLocale projectLocale, URI childURI) { PropertyFileDescriptor fileDescriptor = PropertiesFactory.eINSTANCE.createPropertyFileDescriptor(); fileDescriptor.setLocation(childURI); fileDescriptor.setName(childURI.lastSegment()); fileDescriptor.setVariant(projectLocale.getLocale()); projectLocale.getDescriptors().add(fileDescriptor); Resolvable<?, Resolvable<?, ?>> parent = getOrCreateParent(projectLocale, childURI); parent.getChildren().add(fileDescriptor); return fileDescriptor; }