summaryrefslogtreecommitdiffstats
path: root/server/src/com/vaadin/server/communication/ResourceWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/com/vaadin/server/communication/ResourceWriter.java')
-rw-r--r--server/src/com/vaadin/server/communication/ResourceWriter.java111
1 files changed, 111 insertions, 0 deletions
diff --git a/server/src/com/vaadin/server/communication/ResourceWriter.java b/server/src/com/vaadin/server/communication/ResourceWriter.java
new file mode 100644
index 0000000000..3ba3f3f598
--- /dev/null
+++ b/server/src/com/vaadin/server/communication/ResourceWriter.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.vaadin.server.communication;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import com.vaadin.server.AbstractCommunicationManager;
+import com.vaadin.server.JsonPaintTarget;
+import com.vaadin.ui.CustomLayout;
+import com.vaadin.ui.UI;
+
+/**
+ * Serializes resources to JSON. Currently only used for {@link CustomLayout}
+ * templates.
+ *
+ * @author Vaadin Ltd
+ * @since 7.1
+ */
+public class ResourceWriter implements Serializable {
+
+ /**
+ * Writes a JSON object containing registered resources.
+ *
+ * @param ui
+ * The {@link UI} whose resources to write.
+ * @param writer
+ * The {@link Writer} to use.
+ * @param target
+ * The {@link JsonPaintTarget} containing the resources.
+ * @throws IOException
+ */
+ public void write(UI ui, Writer writer, JsonPaintTarget target)
+ throws IOException {
+
+ // TODO PUSH Refactor so that this is not needed
+ AbstractCommunicationManager manager = ui.getSession()
+ .getCommunicationManager();
+
+ // Precache custom layouts
+
+ // TODO We should only precache the layouts that are not
+ // cached already (plagiate from usedPaintableTypes)
+
+ writer.write("{");
+ int resourceIndex = 0;
+ for (final Iterator<Object> i = target.getUsedResources().iterator(); i
+ .hasNext();) {
+ final String resource = (String) i.next();
+ InputStream is = null;
+ try {
+ is = manager.getThemeResourceAsStream(ui, manager.getTheme(ui),
+ resource);
+ } catch (final Exception e) {
+ // FIXME: Handle exception
+ getLogger().log(Level.FINER,
+ "Failed to get theme resource stream.", e);
+ }
+ if (is != null) {
+
+ writer.write((resourceIndex++ > 0 ? ", " : "") + "\""
+ + resource + "\" : ");
+ final StringBuffer layout = new StringBuffer();
+
+ try {
+ final InputStreamReader r = new InputStreamReader(is,
+ "UTF-8");
+ final char[] buffer = new char[20000];
+ int charsRead = 0;
+ while ((charsRead = r.read(buffer)) > 0) {
+ layout.append(buffer, 0, charsRead);
+ }
+ r.close();
+ } catch (final java.io.IOException e) {
+ // FIXME: Handle exception
+ getLogger().log(Level.INFO, "Resource transfer failed", e);
+ }
+ writer.write("\""
+ + JsonPaintTarget.escapeJSON(layout.toString()) + "\"");
+ } else {
+ // FIXME: Handle exception
+ getLogger().severe("CustomLayout not found: " + resource);
+ }
+ }
+ writer.write("}");
+ }
+
+ private static final Logger getLogger() {
+ return Logger.getLogger(ResourceWriter.class.getName());
+ }
+}