/* * Copyright (c) 2009 Google Inc. * * 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.google.wave.api.impl; import com.google.wave.api.Element; import java.util.ArrayList; import java.util.List; /** * DocumentModifyAction is a class specific to how operations of type * DOCUMENT_MODIFY are serialized. DocumentModifyAction specifies what should * happen to matched bits of the document. * */ public class DocumentModifyAction { public enum ModifyHow { DELETE, REPLACE, INSERT, INSERT_AFTER, ANNOTATE, CLEAR_ANNOTATION, UPDATE_ELEMENT; } /** * Initial annotations to be applied to the document modification range. */ static public class BundledAnnotation { public String key; public String value; /** * Convenience method to create a list of bundled annotations with * the even values passed being the keys, the uneven ones the values. */ public static List<BundledAnnotation> listOf(String... values) { if (values.length % 2 != 0) { throw new IllegalArgumentException("listOf takes an even number of parameters"); } List<BundledAnnotation> res = new ArrayList<BundledAnnotation>(values.length / 2); for (int i = 0; i < values.length - 1; i += 2) { BundledAnnotation next = new BundledAnnotation(); next.key = values[i]; next.value = values[i + 1]; res.add(next); } return res; } } private ModifyHow modifyHow; private List<String> values; private String annotationKey; private List<Element> elements; private List<BundledAnnotation> bundledAnnotations; private boolean useMarkup; public DocumentModifyAction(ModifyHow modifyHow, List<String> values, String annotationKey, List<Element> elements, List<BundledAnnotation> initialAnnotations, boolean useMarkup) { this.modifyHow = modifyHow; this.values = values; this.annotationKey = annotationKey; this.elements = elements; this.useMarkup = useMarkup; this.bundledAnnotations = initialAnnotations; } // No parameter constructor for serialization public DocumentModifyAction() { this.modifyHow = null; this.values = null; this.annotationKey = null; this.elements = null; this.useMarkup = false; this.bundledAnnotations = null; } public ModifyHow getModifyHow() { return modifyHow; } public List<String> getValues() { return values; } public String getAnnotationKey() { return annotationKey; } public List<Element> getElements() { return elements; } public boolean isUseMarkup() { return useMarkup; } /** * @return the value from values (wrapping around) for the given index. */ public String getValue(int valueIndex) { if (values == null || values.isEmpty()) { return null; } return values.get(valueIndex % values.size()); } /** * @return the element from elements (wrapping around) for the given index. */ public Element getElement(int valueIndex) { if (elements == null || elements.isEmpty()) { return null; } return elements.get(valueIndex % elements.size()); } /** * @return whether there is text at the specified index */ public boolean hasTextAt(int valueIndex) { if (values == null || values.isEmpty()) { return false; } return values.get(valueIndex % values.size()) != null; } public List<BundledAnnotation> getBundledAnnotations() { return bundledAnnotations; } }