package org.jetbrains.ether.dependencyView; import org.jetbrains.ether.RW; import java.io.BufferedReader; import java.io.BufferedWriter; /** * Created by IntelliJ IDEA. * User: db * Date: 07.03.11 * Time: 19:54 * To change this template use File | Settings | File Templates. */ public abstract class ProtoMember extends Proto { public final TypeRepr.AbstractType type; public final Object value; public boolean hasValue () { return value != null; } protected ProtoMember(final int access, final String signature, final StringCache.S name, final TypeRepr.AbstractType t, final Object value) { super(access, signature, name); this.type = t; this.value = value; } private static Object readTyped(final BufferedReader r, final String tag) { if (tag.equals("string")) { return RW.readEncodedString(r); } if (tag.equals("none")) { return null; } final String val = RW.readString(r); if (tag.equals("integer")) return Integer.parseInt(val); if (tag.equals("long")) return Long.parseLong(val); if (tag.equals("float")) return Float.parseFloat(val); if (tag.equals("double")) return Double.parseDouble(val); return null; } protected ProtoMember(final BufferedReader r) { super(r); type = TypeRepr.reader.read(r); value = readTyped(r, RW.readString(r)); } public void write(final BufferedWriter w) { super.write(w); type.write(w); if (value instanceof String) { RW.writeln(w, "string"); RW.writeEncodedString(w, (String) value); } else if (value instanceof Integer) { RW.writeln(w, "integer"); RW.writeln(w, value.toString()); } else if (value instanceof Long) { RW.writeln(w, "long"); RW.writeln(w, value.toString()); } else if (value instanceof Float) { RW.writeln(w, "float"); RW.writeln(w, value.toString()); } else if (value instanceof Double) { RW.writeln(w, "double"); RW.writeln(w, value.toString()); } else { RW.writeln(w, "none"); } } public Difference difference(final Proto past) { final ProtoMember m = (ProtoMember) past; final Difference diff = super.difference(past); int base = diff.base(); if (!m.type.equals(type)) { base |= Difference.TYPE; } switch ((value == null ? 0 : 1) + (m.value == null ? 0 : 2)) { case 3: if (!value.equals(m.value)) { base |= Difference.VALUE; } break; case 2: base |= Difference.VALUE; break; case 1: base |= Difference.VALUE; break; case 0: break; } final int newBase = base; return new Difference () { @Override public int base() { return newBase; } @Override public boolean no() { return newBase == Difference.NONE && diff.no(); } @Override public int addedModifiers() { return diff.addedModifiers(); } @Override public int removedModifiers() { return diff.removedModifiers(); } @Override public boolean packageLocalOn() { return diff.packageLocalOn(); } }; } }