// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.debug.core.model; import java.io.IOException; import org.chromium.debug.core.util.ChromiumDebugPluginUtil; import org.chromium.debug.core.util.ScriptTargetMapping; import org.chromium.sdk.RelayOk; import org.chromium.sdk.Script; import org.chromium.sdk.SyncCallback; import org.chromium.sdk.UpdatableScript; import org.eclipse.core.runtime.CoreException; /** * Holds parameters of a planned LiveEdit push operation. This object could be used in * LiveEdit action or preview implementation. * This class is going to become more complicated when we support compound scripts. */ public class PushChangesPlan { public static PushChangesPlan create(ScriptTargetMapping filePair) { // TODO: fix the rough behavior (inside this call). Script script = filePair.getSingleScript(); SourceWrapSupport.Wrapper.Match wrapperMatch; if (filePair.isVirtualProjectResource()) { wrapperMatch = null; } else { SourceWrapSupport sourceWrapSupport = filePair.getConnectedTargetData().getSourceWrapSupport(); wrapperMatch = sourceWrapSupport.chooseWrapper(script.getSource()); } byte[] fileData; try { fileData = ChromiumDebugPluginUtil.readFileContents(filePair.getFile()); } catch (IOException e) { throw new RuntimeException(e); } catch (CoreException e) { throw new RuntimeException(e); } // We are using default charset here as usual. String newSource = new String(fileData); return new PushChangesPlan(script, filePair, newSource, wrapperMatch); } private final Script script; private final String newSource; private final ScriptTargetMapping scriptTargetMapping; private final SourceWrapSupport.Wrapper.Match wrapperMatch; private PushChangesPlan(Script script, ScriptTargetMapping scriptTargetMapping, String newSource, SourceWrapSupport.Wrapper.Match wrapperMatch) { this.script = script; this.newSource = newSource; this.scriptTargetMapping = scriptTargetMapping; this.wrapperMatch = wrapperMatch; } public SourceWrapSupport.Wrapper.Match getSourceWrapperMatch() { return wrapperMatch; } public String getNewSource() { return newSource; } public ScriptTargetMapping getScriptTargetMapping() { return scriptTargetMapping; } public Script getScript() { return script; } public RelayOk execute(boolean previewOnly, UpdatableScript.UpdateCallback callback, SyncCallback syncCallback) { String wrappedSource; if (wrapperMatch == null) { wrappedSource = newSource; } else { wrappedSource = wrapperMatch.wrap(newSource); } if (previewOnly) { return script.previewSetSource(wrappedSource, callback, syncCallback); } else { return script.setSourceOnRemote(wrappedSource, callback, syncCallback); } } }