mirror of
				https://github.com/gyurix1968/guacamole-client.git
				synced 2025-10-31 17:13:21 +00:00 
			
		
		
		
	GUAC-587: Merge translation files when loading extensions.
This commit is contained in:
		| @@ -24,15 +24,22 @@ package org.glyptodon.guacamole.net.basic.extension; | |||||||
|  |  | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
|  | import java.math.BigDecimal; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
|  | import java.util.Iterator; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | import java.util.logging.Level; | ||||||
| import java.util.regex.Matcher; | import java.util.regex.Matcher; | ||||||
| import java.util.regex.Pattern; | import java.util.regex.Pattern; | ||||||
| import javax.servlet.ServletContext; | import javax.servlet.ServletContext; | ||||||
| import org.codehaus.jackson.JsonNode; | import org.codehaus.jackson.JsonNode; | ||||||
| import org.codehaus.jackson.map.ObjectMapper; | import org.codehaus.jackson.map.ObjectMapper; | ||||||
|  | import org.codehaus.jackson.node.JsonNodeFactory; | ||||||
|  | import org.codehaus.jackson.node.ObjectNode; | ||||||
|  | import org.codehaus.jackson.type.TypeReference; | ||||||
|  | import org.glyptodon.guacamole.net.basic.resource.ByteArrayResource; | ||||||
| import org.glyptodon.guacamole.net.basic.resource.Resource; | import org.glyptodon.guacamole.net.basic.resource.Resource; | ||||||
| import org.glyptodon.guacamole.net.basic.resource.WebApplicationResource; | import org.glyptodon.guacamole.net.basic.resource.WebApplicationResource; | ||||||
| import org.slf4j.Logger; | import org.slf4j.Logger; | ||||||
| @@ -102,6 +109,45 @@ public class LanguageResourceService { | |||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Merges the given JSON objects. Any leaf node in overlay will overwrite | ||||||
|  |      * the corresponding path in original. | ||||||
|  |      * | ||||||
|  |      * @param original | ||||||
|  |      *     The original JSON object to which changes should be applied. | ||||||
|  |      * | ||||||
|  |      * @param overlay | ||||||
|  |      *     The JSON object containing changes that should be applied. | ||||||
|  |      * | ||||||
|  |      * @return | ||||||
|  |      *     The newly constructed JSON object that is the result of merging | ||||||
|  |      *     original and overlay. | ||||||
|  |      */ | ||||||
|  |     private JsonNode mergeTranslations(JsonNode original, JsonNode overlay) { | ||||||
|  |  | ||||||
|  |         // If we are at a leaf node, the result of merging is simply the overlay | ||||||
|  |         if (!overlay.isObject() || original == null) | ||||||
|  |             return overlay; | ||||||
|  |  | ||||||
|  |         // Create mutable copy of original | ||||||
|  |         ObjectNode newNode = JsonNodeFactory.instance.objectNode(); | ||||||
|  |         Iterator<String> fieldNames = original.getFieldNames(); | ||||||
|  |         while (fieldNames.hasNext()) { | ||||||
|  |             String fieldName = fieldNames.next(); | ||||||
|  |             newNode.put(fieldName, original.get(fieldName)); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Merge each field | ||||||
|  |         fieldNames = overlay.getFieldNames(); | ||||||
|  |         while (fieldNames.hasNext()) { | ||||||
|  |             String fieldName = fieldNames.next(); | ||||||
|  |             newNode.put(fieldName, mergeTranslations(original.get(fieldName), overlay.get(fieldName))); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         return newNode; | ||||||
|  |  | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Adds or overlays the given language resource, which need not exist in |      * Adds or overlays the given language resource, which need not exist in | ||||||
|      * the ServletContext. If a language resource is already defined for the |      * the ServletContext. If a language resource is already defined for the | ||||||
| @@ -123,8 +169,33 @@ public class LanguageResourceService { | |||||||
|         // Merge language resources if already defined |         // Merge language resources if already defined | ||||||
|         Resource existing = resources.get(key); |         Resource existing = resources.get(key); | ||||||
|         if (existing != null) { |         if (existing != null) { | ||||||
|             // TODO: Merge |  | ||||||
|             logger.debug("Merged strings with existing language: \"{}\"", key); |             try { | ||||||
|  |  | ||||||
|  |                 // Get resource stream | ||||||
|  |                 InputStream existingStream = existing.asStream(); | ||||||
|  |                 InputStream resourceStream = resource.asStream(); | ||||||
|  |                 if (existingStream == null || resourceStream == null) { | ||||||
|  |                     logger.warn("Language resource \"{}\" does not exist.", key); | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 // Read the original and new language resources | ||||||
|  |                 JsonNode existingTree = mapper.readTree(existingStream); | ||||||
|  |                 JsonNode resourceTree = mapper.readTree(resourceStream); | ||||||
|  |  | ||||||
|  |                 // Merge the language resources | ||||||
|  |                 JsonNode mergedTree = mergeTranslations(existingTree, resourceTree); | ||||||
|  |                 resources.put(key, new ByteArrayResource("application/json", mapper.writeValueAsBytes(mergedTree))); | ||||||
|  |  | ||||||
|  |                 logger.debug("Merged strings with existing language: \"{}\"", key); | ||||||
|  |  | ||||||
|  |             } | ||||||
|  |             catch (IOException e) { | ||||||
|  |                 logger.error("Unable to merge language resource \"{}\": {}", key, e.getMessage()); | ||||||
|  |                 logger.debug("Error merging language resource.", e); | ||||||
|  |             } | ||||||
|  |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         // Otherwise, add new language resource |         // Otherwise, add new language resource | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user