/** * calculates a diff between existing locales and selected ones. * Deletes and adds ProjectLocales as needed * @param object * @param input */ protected void applyLocaleList(List<String> object, IModel<ProjectVersion> input) { Set<String> locales = new HashSet<String>(object); ProjectVersion version = input.getObject(); List<ProjectLocale> projectLocales = version.getChildren(); List<ProjectLocale> toDelete = new ArrayList<>(); for (Iterator<ProjectLocale> iterator = projectLocales.iterator(); iterator.hasNext();) { ProjectLocale projectLocale = iterator.next(); if(projectLocale.isMaster()) continue; if(!locales.remove(projectLocale.getName())) { toDelete.add(projectLocale); } } for (ProjectLocale projectLocale : toDelete) { LOGGER.info("Deleting ProjectLocale {} from {}",projectLocale.getName(), version.fullPath()); EcoreUtil.delete(projectLocale, true); } for (String locale : locales) { ProjectLocale projectLocale = PropertiesFactory.eINSTANCE.createProjectLocale(); projectLocale.setLocale((Locale) PropertiesFactory.eINSTANCE.createFromString(PropertiesPackage.Literals.LOCALE, locale)); LOGGER.info("Adding ProjectLocale {} to {}",projectLocale.getName(), version.fullPath()); PropertyResourceUtil.addNewLocale(projectLocale, input.getObject()); } }
private void deleteDescriptor(URI uri) { PropertyFileDescriptor descriptor = findDescriptor(uri); if (descriptor != null) PropertyResourceUtil.removeDescriptor(descriptor); }
public static void createMissingDescriptorEntries(ProjectVersion parent, IProgressMonitor monitor) { EList<ProjectLocale> children = parent.getChildren(); monitor.beginTask("Adding missing localized resources", children.size() - 1); ProjectLocale template = parent.getTemplate(); for (ProjectLocale locale : children) { if (locale == template) continue; if (locale != null && locale.getLocale() != null) monitor.subTask("Add missing entries for " + locale.getLocale().getDisplayName()); createMissingChildren(template, locale); monitor.worked(1); } monitor.subTask(""); monitor.done(); }
File baseDir = new File(absolutPath().path()).getAbsoluteFile(); SubMonitor subMonitor = SubMonitor.convert(monitor, "Scanning", 100); PropertyScanner propertyScanner = PropertyResourceUtil.createScanner(this); scanner.fullScan(new FullScanFileAcceptor(this, propertyScanner, configuration), baseDir, propertyScanner, configuration, subMonitor.newChild(50)); PropertyResourceUtil.createMissingDescriptorEntries(this, subMonitor.newChild(50));
public static PropertyScanner createScanner(ProjectVersion version) { Project project = version.getParent(); String propertyType = project.getPropertyType(); return createScanner(propertyType); }
@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); }
private static void createMissingChildren(ProjectLocale template, ProjectLocale other) { EList<PropertyFileDescriptor> descriptors = template.getDescriptors(); for (PropertyFileDescriptor descriptor : descriptors) { URI derivedLocation = computeLocaleResourceLocation(other.getLocale(), other.getParent(), descriptor.getLocation()); Resolvable<?, ?> child = other.resolveChild(derivedLocation); if(child==null){ Resolvable<?, ?> folder = getOrCreateFolder(other, derivedLocation.trimSegments(1).segments()); PropertyFileDescriptor localeDescriptor = PropertiesFactory.eINSTANCE.createPropertyFileDescriptor(); localeDescriptor.setMaster(descriptor); localeDescriptor.setVariant(other.getLocale()); localeDescriptor.setLocation(derivedLocation); localeDescriptor.setProjectLocale(other); localeDescriptor.setParent(folder); localeDescriptor.setName(URI.decode(derivedLocation.lastSegment())); } } }
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); }
URI derivedLocation = computeLocaleResourceLocation(locale.getLocale(), version, descriptor.getLocation());
PropertyResourceUtil.addNewTemplateDescriptor(descriptor,getProjectVersion());
public static URI computeTemplateResourceLocation(Locale locale, URI translationLocation, Locale masterLocale, ProjectVersion version) { PropertyScanner scanner = createScanner(version); URI parentPath = version.absoluteFilePath(); File path = scanner.findTemplate(new File(parentPath.path()+translationLocation.toString()), null); URI location = URI.createFileURI(path.getAbsolutePath()); URI trimmedLocation = URI.createURI(location.segment(parentPath.segmentCount())); for (int i = parentPath.segmentCount()+1; i < location.segmentCount(); i++) { //append the other segments trimmedLocation = trimmedLocation.appendSegment(location.segment(i)); } return trimmedLocation; }
public ProjectLocale getOrCreateProjectLocale(Locale locale) { ProjectLocale projectLocale = getProjectVersion().getProjectLocale(locale); if (projectLocale == null) { projectLocale = PropertiesFactory.eINSTANCE.createProjectLocale(); projectLocale.setLocale(locale); getProjectVersion().getChildren().add(projectLocale); PropertyResourceUtil.addNewLocale(projectLocale, getProjectVersion()); } return projectLocale; }
@Override public ProjectLocale apply(PropertyFileDescriptor object) { ProjectLocale locale = object.getProjectLocale(); if(!object.isMaster()) object = object.getMaster(); if(object!=null) PropertyResourceUtil.removeDescriptor(object); return locale; }; });
protected PropertyFileDescriptor findDescriptor(URI path) { PropertyScanner scanner = PropertyResourceUtil.createScanner(this); Locale variant = scanner.getLocale(new File(path.path())); ProjectLocale locale = variant == null ? getTemplate() : getProjectLocale(variant); if (locale == null) return null; EList<PropertyFileDescriptor> descriptors = locale.getDescriptors(); for (PropertyFileDescriptor descriptor : descriptors) { if (path.equals(descriptor.getLocation())) { return descriptor; } } return null; }
public static void addNewLocale(ProjectLocale locale, ProjectVersion version) { ProjectLocale template = version.getTemplate(); version.getChildren().add(locale); if(template==null) { //we always need a template template = PropertiesFactory.eINSTANCE.createProjectLocale(); version.setTemplate(template); template.setName("template"); version.getChildren().add(template); } createMissingChildren(template, locale); }
@Override public ProjectVersion apply(ProjectVersion object) { ProjectLocale locale = PropertiesFactory.eINSTANCE.createProjectLocale(); locale.setName(uri.lastSegment()); locale.setLocale((Locale) PropertiesFactory.eINSTANCE.createFromString(PropertiesPackage.Literals.LOCALE, uri.lastSegment())); PropertyResourceUtil.addNewLocale(locale, object); return object; } });
@Override protected void doSave(OutputStream outputStream, Map<?, ?> options) throws IOException { savedProperties = 0; String type = getPropertyType(options); PropertyScanner scanner = PropertyResourceUtil.createScanner(type); String encoding = scanner.getEncoding(); PropertyConverter converter = scanner.createConverter(getURI()); try{ PropertyFile file = (PropertyFile) getContents().get(0); savedProperties = converter.write(outputStream, file,encoding); } finally{ outputStream.close(); } }
@Override protected void doLoad(InputStream inputStream, Map<?, ?> options) throws IOException { String type = getPropertyType(options); PropertyScanner scanner = PropertyResourceUtil.createScanner(type); PropertyConverter converter = scanner.createConverter(getURI()); PropertyFile file = converter.load(inputStream, scanner.getEncoding()); getContents().add(file); }
public static URI computeLocaleResourceLocation(Locale locale, ProjectVersion version, URI templateLocation) { PropertyScanner scanner = createScanner(version); URI parentPath = version.absoluteFilePath(); String childPath = templateLocation.path(); if (childPath != null && !childPath.startsWith("/")) childPath = "/" + childPath; File path = scanner.computeTranslationPath(new File(URI.decode(parentPath.path()) + URI.decode(childPath)), version.getTemplate().getLocale(), locale); /* * workaround for https://github.com/jutzig/jabylon/issues/238 certain * issues seem to trigger a bug in EMFs createFileURI */ URI location = URI.createURI(path.getAbsolutePath().replace('\\','/')); URI trimmedLocation = URI.createURI(location.segment(parentPath.segmentCount())); for (int i = parentPath.segmentCount() + 1; i < location.segmentCount(); i++) { // append the other segments trimmedLocation = trimmedLocation.appendSegment(location.segment(i)); } return trimmedLocation; }
PropertyScanner propertyScanner = PropertyResourceUtil.createScanner(this); WorkspaceScanner scanner = new WorkspaceScanner(); File baseDir = new File(absolutPath().path()).getAbsoluteFile();