/* * Freeplane - mind map editor * Copyright (C) 2011 Volker Boerchers * * This file author is Volker Boerchers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.freeplane.features.format; import org.freeplane.core.util.FactoryMethod; import org.freeplane.core.util.LogUtils; import org.freeplane.core.util.SerializationMethod; import org.freeplane.core.util.TextUtils; import org.freeplane.core.util.TypeReference; /** * A generic multi purpose IFormattedObject but mainly for the formatting of strings. * @author vboerchers */ @FactoryMethod("deserialize") @SerializationMethod("serialize") public class FormattedObject implements IFormattedObject { private final Object object; private final String formattedString; private final PatternFormat patternFormat; /** tries to guess the right pattern formatter from format. * @throws IllegalArgumentException if value is not formattable with format. */ public FormattedObject(final Object value, final String format) { this(value, PatternFormat.guessPatternFormat(format)); } /** @throws IllegalArgumentException if value is not formattable with format. */ public FormattedObject(final Object object, final PatternFormat format) { this.patternFormat = format; this.object = object; validate(); this.formattedString = String.valueOf(patternFormat.formatObject(object)); } private void validate() { if (patternFormat == null) { throw new IllegalArgumentException(TextUtils.getText("format_invalid_pattern")); } } public String getPattern() { return patternFormat.getPattern(); } public Object getObject() { return object; } public static String serialize(final FormattedObject formattedObject) { return serializeUnformattedObject(formattedObject) + "|" + formattedObject.patternFormat.serialize(); } private static String serializeUnformattedObject(final FormattedObject formattedObject) { // String unformattedObject; // if (formattedObject.object instanceof IFormattedObject) // unformattedObject = TypeReference.toSpec(formattedObject.object); // else // unformattedObject = formattedObject.object == null ? "" : formattedObject.object.toString(); return TypeReference.encode(TypeReference.toSpec(formattedObject.object)); } public static Object deserialize(final String text) { try { final int index = text.indexOf('|'); final Object object = deserializeUnformattedObject(text, index); return new FormattedObject(object, PatternFormat.deserialize(text.substring(index + 1))); } catch (Exception e) { LogUtils.warn("cannot deserialize " + text, e); return text; } } private static Object deserializeUnformattedObject(final String text, final int index) { final String spec = text.substring(0, index); return TypeReference.create(TypeReference.decode(spec), false); } @Override public String toString() { return formattedString; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((patternFormat == null) ? 0 : patternFormat.hashCode()); result = prime * result + ((object == null) ? 0 : object.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; FormattedObject other = (FormattedObject) obj; if (patternFormat == null) { if (other.patternFormat != null) return false; } else if (!patternFormat.equals(other.patternFormat)) return false; if (object == null) { if (other.object != null) return false; } else if (!object.equals(other.object)) return false; return true; } }