blob: b99bcbb2166e149ae6f1a177c636ec5d8289c16c [file] [log] [blame]
/*
* Copyright 2008 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.gwt.core.ext.soyc.impl;
import com.google.gwt.core.ext.soyc.Member;
import com.google.gwt.core.ext.soyc.Story;
import java.io.Serializable;
import java.util.Comparator;
import java.util.Set;
import java.util.SortedSet;
/**
* An implementation of the Story interface. This type has two additional pieces
* of information not required by the Story interface. The first is a unique id
* number and the second is a length. Instead of storing range objects for each
* StoryImpl, we simply store the StoryImpls in order and calculate the Range
* for the StoryImpl based on its length.
*
* @see SnippetIterator#next()
*/
public class StoryImpl implements Story, Serializable {
/**
* Orders StoryImpl's by their id number.
*/
public static final Comparator<Story> ID_COMPARATOR = new StoryImplComparator();
private final int id;
private final int fragment;
private final int length;
private final String literalDescription;
private final SortedSet<Member> members;
private final Set<Origin> origins;
/**
* Standard constructor. This constructor will create unmodifiable versions of
* the collections passed into it.
*/
public StoryImpl(int id, SortedSet<Member> members,
Set<Origin> origins, String literalDescription, int fragment,
int length) {
assert members != null;
assert origins != null;
assert fragment >= 0;
assert length > 0;
// literalDescription may be null
this.id = id;
this.fragment = fragment;
this.length = length;
this.literalDescription = literalDescription == null ? null
: literalDescription.intern();
this.members = members;
this.origins = origins;
}
/**
* This is a copy-constructor that's used when we subdivide a Range. All we
* really care about in the shadow version is having a different length; all
* of the other fields are initialized from the original.
*/
public StoryImpl(StoryImpl other, int length) {
this.id = other.id;
this.fragment = other.fragment;
this.length = length;
this.literalDescription = other.literalDescription;
this.members = other.members;
this.origins = other.origins;
}
/**
* Identity is based on the <code>id</code> field.
*/
@Override
public boolean equals(Object obj) {
if (!(obj instanceof StoryImpl)) {
return false;
}
StoryImpl o = (StoryImpl) obj;
return id == o.id;
}
public int getFragment() {
return fragment;
}
public int getId() {
return id;
}
/**
* Used internally, and not specified by the Story interface.
*/
public int getLength() {
return length;
}
public String getLiteralTypeName() {
return literalDescription;
}
public SortedSet<Member> getMembers() {
return members;
}
public Set<Origin> getSourceOrigin() {
return origins;
}
/**
* Identity is based on the <code>id</code> field.
*/
@Override
public int hashCode() {
return id;
}
}