diff options
7 files changed, 93 insertions, 37 deletions
diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java index 40c284437..41361a568 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/ProjectCallback.java @@ -83,12 +83,12 @@ public final class ProjectCallback extends LegacyCallback { private final IProject mProject; private final ClassLoader mParentClassLoader; private final ProjectResources mProjectRes; + private final Object mCredential; private boolean mUsed = false; private String mNamespace; private ProjectClassLoader mLoader = null; private LayoutLog mLogger; private LayoutLibrary mLayoutLib; - private String mLayoutName; private ILayoutPullParser mLayoutEmbeddedParser; private ResourceResolver mResourceResolver; @@ -99,13 +99,15 @@ public final class ProjectCallback extends LegacyCallback { * @param layoutLib The layout library this callback is going to be invoked from * @param projectRes the {@link ProjectResources} for the project. * @param project the project. + * @param credential the sandbox credential */ public ProjectCallback(LayoutLibrary layoutLib, - ProjectResources projectRes, IProject project) { + ProjectResources projectRes, IProject project, Object credential) { mLayoutLib = layoutLib; mParentClassLoader = layoutLib.getClassLoader(); mProjectRes = projectRes; mProject = project; + mCredential = credential; } public Set<String> getMissingClasses() { @@ -164,17 +166,12 @@ public final class ProjectCallback extends LegacyCallback { if (mLoader == null) { // Allow creating class loaders during rendering; may be prevented by the // RenderSecurityManager - RenderSecurityManager renderSecurityManager = RenderSecurityManager.getCurrent(); - if (renderSecurityManager != null) { - renderSecurityManager.setActive(false); - } + boolean token = RenderSecurityManager.enterSafeRegion(mCredential); try { System.setSecurityManager(null); mLoader = new ProjectClassLoader(mParentClassLoader, mProject); } finally { - if (renderSecurityManager != null) { - renderSecurityManager.setActive(true); - } + RenderSecurityManager.exitSafeRegion(token); } } clazz = mLoader.loadClass(className); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java index 4bfca1d27..327279b12 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/GraphicalEditorPart.java @@ -288,6 +288,7 @@ public class GraphicalEditorPart extends EditorPart private FlyoutControlComposite mPaletteComposite; private PropertyFactory mPropertyFactory; private boolean mRenderedOnce; + private final Object mCredential = new Object(); /** * Flags which tracks whether this editor is currently active which is set whenever @@ -1527,11 +1528,43 @@ public class GraphicalEditorPart extends EditorPart return true; } + /** + * Creates a {@link RenderService} associated with this editor + * @return the render service + */ + @NonNull + public RenderService createRenderService() { + return RenderService.create(this, mCredential); + } + + /** + * Creates a {@link RenderLogger} associated with this editor + * @param name the name of the logger + * @return the new logger + */ + @NonNull + public RenderLogger createRenderLogger(String name) { + return new RenderLogger(name, mCredential); + } + + /** + * Creates a {@link RenderService} associated with this editor + * + * @param configuration the configuration to use (and fallback to editor for the rest) + * @param resolver a resource resolver to use to look up resources + * @return the render service + */ + @NonNull + public RenderService createRenderService(Configuration configuration, + ResourceResolver resolver) { + return RenderService.create(this, configuration, resolver, mCredential); + } + private void renderWithBridge(IProject iProject, UiDocumentNode model, LayoutLibrary layoutLib) { LayoutCanvas canvas = getCanvasControl(); Set<UiElementNode> explodeNodes = canvas.getNodesToExplode(); - RenderLogger logger = new RenderLogger(mEditedFile.getName()); + RenderLogger logger = createRenderLogger(mEditedFile.getName()); RenderingMode renderingMode = RenderingMode.NORMAL; // FIXME set the rendering mode using ViewRule or something. List<UiElementNode> children = model.getUiChildren(); @@ -1540,7 +1573,7 @@ public class GraphicalEditorPart extends EditorPart renderingMode = RenderingMode.V_SCROLL; } - RenderSession session = RenderService.create(this) + RenderSession session = RenderService.create(this, mCredential) .setModel(model) .setLog(logger) .setRenderingMode(renderingMode) @@ -1653,7 +1686,8 @@ public class GraphicalEditorPart extends EditorPart ResourceManager resManager = ResourceManager.getInstance(); IProject project = getProject(); ProjectResources projectRes = resManager.getProjectResources(project); - mProjectCallback = new ProjectCallback(layoutLibrary, projectRes, project); + mProjectCallback = new ProjectCallback(layoutLibrary, projectRes, project, + mCredential); } else if (reset) { // Also clears the set of missing/broken classes prior to rendering mProjectCallback.getMissingClasses().clear(); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java index c92ce815f..5661b2919 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PreviewIconFactory.java @@ -267,7 +267,7 @@ public class PreviewIconFactory { .setModel(model) .setOverrideRenderSize(width, height) .setRenderingMode(RenderingMode.FULL_EXPAND) - .setLog(new RenderLogger("palette")) + .setLog(editor.createRenderLogger("palette")) .setOverrideBgColor(overrideBgColor) .setDecorations(false) .createRenderSession(); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java index c0d997f78..8548830bd 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLogger.java @@ -44,10 +44,12 @@ public class RenderLogger extends LayoutLog { private List<String> mTags; private List<Throwable> mTraces; private static Set<String> sIgnoredFidelityWarnings; + private final Object mCredential; /** Construct a logger for the given named layout */ - RenderLogger(String name) { + RenderLogger(String name, Object credential) { mName = name; + mCredential = credential; } /** @@ -311,10 +313,7 @@ public class RenderLogger extends LayoutLog { // Append the given message to the ADT log. Bypass the sandbox if necessary // such that we can write to the log file. private void appendToIdeLog(Throwable throwable, int severity, String description) { - RenderSecurityManager renderSecurityManager = RenderSecurityManager.getCurrent(); - if (renderSecurityManager != null) { - renderSecurityManager.setActive(false); - } + boolean token = RenderSecurityManager.enterSafeRegion(mCredential); try { if (throwable != null) { AdtPlugin.log(throwable, "%1$s: %2$s", mName, description); @@ -322,9 +321,7 @@ public class RenderLogger extends LayoutLog { AdtPlugin.log(severity, "%1$s: %2$s", mName, description); } } finally { - if (renderSecurityManager != null) { - renderSecurityManager.setActive(true); - } + RenderSecurityManager.exitSafeRegion(token); } } } diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java index 07baaeb21..5621d5f17 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java @@ -555,7 +555,7 @@ public class RenderPreview implements IJobChangeListener { } else { renderService.setModel(editor.getModel()); } - RenderLogger log = new RenderLogger(getDisplayName()); + RenderLogger log = editor.createRenderLogger(getDisplayName()); renderService.setLog(log); RenderSession session = renderService.createRenderSession(); Result render = session.render(1000); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java index 53bd096d8..c274d3c23 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderService.java @@ -108,10 +108,12 @@ public class RenderService { private Integer mOverrideBgColor; private boolean mShowDecorations = true; private Set<UiElementNode> mExpandNodes = Collections.<UiElementNode>emptySet(); + private final Object mCredential; /** Use the {@link #create} factory instead */ - private RenderService(GraphicalEditorPart editor) { + private RenderService(GraphicalEditorPart editor, Object credential) { mEditor = editor; + mCredential = credential; mProject = editor.getProject(); LayoutCanvas canvas = editor.getCanvasControl(); @@ -135,8 +137,10 @@ public class RenderService { } private RenderService(GraphicalEditorPart editor, - Configuration configuration, ResourceResolver resourceResolver) { + Configuration configuration, ResourceResolver resourceResolver, + Object credential) { mEditor = editor; + mCredential = credential; mProject = editor.getProject(); LayoutCanvas canvas = editor.getCanvasControl(); @@ -206,9 +210,20 @@ public class RenderService { * @return a {@link RenderService} which can perform rendering services */ public static RenderService create(GraphicalEditorPart editor) { - RenderService renderService = new RenderService(editor); + // Delegate to editor such that it can pass its credential to the service + return editor.createRenderService(); + } - return renderService; + /** + * Creates a new {@link RenderService} associated with the given editor. + * + * @param editor the editor to provide configuration data such as the render target + * @param credential the sandbox credential + * @return a {@link RenderService} which can perform rendering services + */ + @NonNull + public static RenderService create(GraphicalEditorPart editor, Object credential) { + return new RenderService(editor, credential); } /** @@ -221,9 +236,22 @@ public class RenderService { */ public static RenderService create(GraphicalEditorPart editor, Configuration configuration, ResourceResolver resolver) { - RenderService renderService = new RenderService(editor, configuration, resolver); + // Delegate to editor such that it can pass its credential to the service + return editor.createRenderService(configuration, resolver); + } - return renderService; + /** + * Creates a new {@link RenderService} associated with the given editor. + * + * @param editor the editor to provide configuration data such as the render target + * @param configuration the configuration to use (and fallback to editor for the rest) + * @param resolver a resource resolver to use to look up resources + * @param credential the sandbox credential + * @return a {@link RenderService} which can perform rendering services + */ + public static RenderService create(GraphicalEditorPart editor, + Configuration configuration, ResourceResolver resolver, Object credential) { + return new RenderService(editor, configuration, resolver, credential); } /** @@ -471,7 +499,7 @@ public class RenderService { mProjectCallback.setResourceResolver(mResourceResolver); RenderSecurityManager securityManager = createSecurityManager(); try { - securityManager.setActive(true); + securityManager.setActive(true, mCredential); synchronized (RENDERING_LOCK) { return mLayoutLib.createSession(params); } @@ -480,7 +508,7 @@ public class RenderService { mLogger.error(null, t.getLocalizedMessage(), t, null); throw t; } finally { - securityManager.dispose(); + securityManager.dispose(mCredential); mProjectCallback.setLogger(null); mProjectCallback.setResourceResolver(null); } @@ -584,7 +612,7 @@ public class RenderService { mProjectCallback.setResourceResolver(mResourceResolver); RenderSecurityManager securityManager = createSecurityManager(); try { - securityManager.setActive(true); + securityManager.setActive(true, mCredential); synchronized (RENDERING_LOCK) { session = mLayoutLib.createSession(params); } @@ -610,7 +638,7 @@ public class RenderService { mLogger.error(null, t.getLocalizedMessage(), t, null); throw t; } finally { - securityManager.dispose(); + securityManager.dispose(mCredential); mProjectCallback.setLogger(null); mProjectCallback.setResourceResolver(null); if (session != null) { diff --git a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java index 5748791f3..c28d9a966 100644 --- a/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java +++ b/eclipse/plugins/com.android.ide.eclipse.tests/unittests/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderLoggerTest.java @@ -20,12 +20,12 @@ import junit.framework.TestCase; public class RenderLoggerTest extends TestCase { public void testLogger1() throws Exception { - RenderLogger l = new RenderLogger("foo"); + RenderLogger l = new RenderLogger("foo", null); assertFalse(l.hasProblems()); } public void testLogger2() throws Exception { - RenderLogger l = new RenderLogger("foo"); + RenderLogger l = new RenderLogger("foo", null); assertFalse(l.hasProblems()); l.fidelityWarning(null, "No perspective Transforms", null, null); l.fidelityWarning(null, "No GPS", null, null); @@ -37,7 +37,7 @@ public class RenderLoggerTest extends TestCase { } public void testLogger3() throws Exception { - RenderLogger l = new RenderLogger("foo"); + RenderLogger l = new RenderLogger("foo", null); assertFalse(l.hasProblems()); l.error("timeout", "Sample Error", new RuntimeException(), null); l.warning("slow", "Sample warning", null); @@ -56,7 +56,7 @@ public class RenderLoggerTest extends TestCase { } public void testLoggerSuppressWarnings() throws Exception { - RenderLogger l = new RenderLogger("foo"); + RenderLogger l = new RenderLogger("foo", null); assertFalse(l.hasProblems()); RenderLogger.ignoreFidelityWarning("No perspective Transforms"); l.fidelityWarning(null, "No perspective Transforms", null, null); @@ -68,7 +68,7 @@ public class RenderLoggerTest extends TestCase { assertFalse(l.seenTag("foo")); assertFalse(l.seenTag(null)); - l = new RenderLogger("foo"); + l = new RenderLogger("foo", null); assertFalse(l.hasProblems()); RenderLogger.ignoreFidelityWarning("No perspective Transforms"); RenderLogger.ignoreFidelityWarning("No GPS"); |