Package com.goodow.realtime.store.impl

Source Code of com.goodow.realtime.store.impl.IndexReferenceImpl

/*
* Copyright 2012 Goodow.com
*
* 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.goodow.realtime.store.impl;

import com.goodow.realtime.core.Handler;
import com.goodow.realtime.core.Registration;
import com.goodow.realtime.json.Json;
import com.goodow.realtime.json.JsonObject;
import com.goodow.realtime.operation.OperationComponent;
import com.goodow.realtime.operation.create.CreateComponent;
import com.goodow.realtime.operation.cursor.ReferenceShiftedComponent;
import com.goodow.realtime.store.CollaborativeObject;
import com.goodow.realtime.store.EventType;
import com.goodow.realtime.store.IndexReference;
import com.goodow.realtime.store.ReferenceShiftedEvent;

class IndexReferenceImpl extends CollaborativeObjectImpl implements IndexReference {
  private String referencedObjectId;
  private int index = -1;
  private boolean canBeDeleted;

  /**
   * @param model The document model.
   */
  IndexReferenceImpl(ModelImpl model) {
    super(model);
  }

  @Override public Registration onReferenceShifted(Handler<ReferenceShiftedEvent> handler) {
    return addEventListener(EventType.REFERENCE_SHIFTED, handler, false);
  }

  @Override public boolean canBeDeleted() {
    return canBeDeleted;
  }

  @Override public int index() {
    return index;
  }

  @Override public <T extends CollaborativeObject> T referencedObject() {
    return model.getObject(referencedObjectId);
  }

  @Override public void setIndex(int index) {
    if (index == this.index) {
      return;
    }
    ReferenceShiftedComponent op =
        new ReferenceShiftedComponent(id, referencedObjectId, index, canBeDeleted, this.index);
    consumeAndSubmit(op);
  }

  @Override
  public JsonObject toJson() {
    JsonObject json = Json.createObject();
    json.set("id", id).set("referencedObjectId", referencedObjectId).set("index", index).set(
        "canBeDeleted", canBeDeleted);
    return json;
  }

  @Override
  protected void consume(final String userId, final String sessionId,
      OperationComponent<?> component) {
    ReferenceShiftedComponent op = (ReferenceShiftedComponent) component;
    assert op.oldIndex == index() || index() == -1;
    referencedObjectId = op.referencedObjectId;
    index = op.newIndex;
    canBeDeleted = op.canBeDeleted;
    if (op.oldIndex != -1 && op.oldIndex != op.newIndex) {
      ReferenceShiftedEvent event =
          new ReferenceShiftedEventImpl(event(sessionId, userId).set("oldIndex", op.oldIndex).set(
              "newIndex", op.newIndex));
      fireEvent(event);
    }
  }

  @Override
  OperationComponent<?>[] toInitialization() {
    ReferenceShiftedComponent op =
        new ReferenceShiftedComponent(id, referencedObjectId, index, canBeDeleted, index);
    return new OperationComponent[] {new CreateComponent(id, CreateComponent.INDEX_REFERENCE), op};
  }
}
TOP

Related Classes of com.goodow.realtime.store.impl.IndexReferenceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.