001/**
002 * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
003 *   This file is part of the LDP4j Project:
004 *     http://www.ldp4j.org/
005 *
006 *   Center for Open Middleware
007 *     http://www.centeropenmiddleware.com/
008 * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
009 *   Copyright (C) 2014-2016 Center for Open Middleware.
010 * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
011 *   Licensed under the Apache License, Version 2.0 (the "License");
012 *   you may not use this file except in compliance with the License.
013 *   You may obtain a copy of the License at
014 *
015 *             http://www.apache.org/licenses/LICENSE-2.0
016 *
017 *   Unless required by applicable law or agreed to in writing, software
018 *   distributed under the License is distributed on an "AS IS" BASIS,
019 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
020 *   See the License for the specific language governing permissions and
021 *   limitations under the License.
022 * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
023 *   Artifact    : org.ldp4j.framework:ldp4j-application-api:0.2.1
024 *   Bundle      : ldp4j-application-api-0.2.1.jar
025 * #-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=#
026 */
027package org.ldp4j.application.data;
028
029import java.net.URI;
030
031public final class FormatUtils {
032
033  private static final class IdFormatter implements IndividualVisitor {
034
035    private String format;
036
037    private IdFormatter() {
038    }
039
040    private String getFormat() {
041      return this.format;
042    }
043
044    @Override
045    public void visitManagedIndividual(ManagedIndividual individual) {
046      this.format=formatManagedIndividualId(individual.id());
047    }
048
049    @Override
050    public void visitRelativeIndividual(RelativeIndividual individual) {
051      this.format=formatRelativeIndividualId(individual.id());
052    }
053
054    @Override
055    public void visitLocalIndividual(LocalIndividual individual) {
056      this.format=formatLocalIndividualId(individual.id());
057    }
058
059    @Override
060    public void visitExternalIndividual(ExternalIndividual individual) {
061      this.format=formatExternalIndividualId(individual.id());
062    }
063
064    @Override
065    public void visitNewIndividual(NewIndividual individual) {
066      this.format=formatNewIndividualId(individual.id());
067    }
068
069  }
070
071  private static final class LiteralFormatter implements LiteralVisitor {
072
073    private String format;
074
075    private LiteralFormatter() {
076    }
077
078    @Override
079    public void visitLiteral(Literal<?> literal) {
080      this.format=String.format(SIMPLE_FORMAT,literal.get(),literal.get().getClass().getCanonicalName());
081    }
082
083    @Override
084    public void visitTypedLiteral(TypedLiteral<?> literal) {
085      this.format=String.format(COMPOSITE_FORMAT,literal.get(),literal.type(),literal.get().getClass().getCanonicalName());
086    }
087
088    @Override
089    public void visitLanguageLiteral(LanguageLiteral literal) {
090      this.format=String.format(COMPOSITE_FORMAT,literal.get(),literal.language(),literal.get().getClass().getCanonicalName());
091    }
092
093    private String getFormat() {
094      return this.format;
095    }
096
097  }
098
099  private static final class ValueFormatter implements ValueVisitor {
100
101    private String format=null;
102
103    private ValueFormatter() {
104    }
105
106    private String getFormat() {
107      return this.format;
108    }
109
110    @Override
111    public void visitLiteral(Literal<?> value) {
112      this.format=FormatUtils.formatLiteral(value);
113    }
114    @Override
115    public void visitIndividual(Individual<?, ?> value) {
116      this.format=FormatUtils.formatId(value);
117    }
118
119  }
120
121  private static final class PropertyValueFormatter implements ValueVisitor {
122
123    private final StringBuilder builder;
124
125    private PropertyValueFormatter(StringBuilder builder) {
126      this.builder = builder;
127    }
128
129    private void formatValue(String str) {
130      this.builder.append(TAB).append(TAB).append(TAB).append("* ").append(str).append(NL);
131    }
132
133    @Override
134    public void visitLiteral(Literal<?> value) {
135      formatValue(FormatUtils.formatLiteral(value));
136    }
137
138    @Override
139    public void visitIndividual(Individual<?, ?> value) {
140      formatValue(FormatUtils.formatId(value));
141    }
142
143  }
144
145  private static final String BLOCK_START = ") {";
146  private static final String BLOCK_END   = "}";
147  private static final String TAB         = "\t";
148  private static final String NL          =System.lineSeparator();
149
150
151  private static final String NEW_ID_FORMAT              = "<%s> {New}";
152  private static final String RELATIVE_ID_FORMAT         = "<%s> {Parent: %s}";
153  private static final String MANAGED_ID_INDIRECT_FORMAT = "%s {Managed by: %s, indirect id: <%s>}";
154  private static final String MANAGED_ID_FORMAT          = "%s {Managed by: %s}";
155  private static final String LOCAL_ID_FORMAT            = "%s [%s] {Local}";
156  private static final String EXTERNAL_ID_FORMAT         = "<%s> {External}";
157  private static final String COMPOSITE_FORMAT           = "%s (%s) [%s]";
158  private static final String SIMPLE_FORMAT              = "%s [%s]";
159  private static final String NULL                       = "<null>";
160
161  private FormatUtils() {
162  }
163
164  private static String formatNewIndividualId(Object id) {
165    return String.format(NEW_ID_FORMAT, id);
166  }
167
168  private static String formatExternalIndividualId(Object id) {
169    return String.format(EXTERNAL_ID_FORMAT,id);
170  }
171
172  private static String formatLocalIndividualId(Name<?> name) {
173    return String.format(LOCAL_ID_FORMAT,name,name.getClass().getCanonicalName());
174  }
175
176  private static String formatRelativeIndividualId(RelativeIndividualId rid) {
177    return String.format(RELATIVE_ID_FORMAT,rid.path(),rid.parentId());
178  }
179
180  private static String formatManagedIndividualId(ManagedIndividualId mId) {
181    String result=null;
182    if(mId.indirectId()==null) {
183      result=String.format(MANAGED_ID_FORMAT,mId.name(),mId.managerId());
184    } else {
185      result=String.format(MANAGED_ID_INDIRECT_FORMAT,mId.name(),mId.managerId(),mId.indirectId());
186    }
187    return result;
188  }
189
190  public static String formatLiteral(final Literal<?> literal) {
191    if(literal==null) {
192      return NULL;
193    }
194    LiteralFormatter literalFormatter = new LiteralFormatter();
195    literal.accept(literalFormatter);
196    return literalFormatter.getFormat();
197  }
198
199  public static String formatName(Name<?> name) {
200    if(name==null) {
201      return NULL;
202    }
203    return String.format(SIMPLE_FORMAT,name.id(),name.id().getClass().getCanonicalName());
204  }
205
206  public static String formatId(Individual<?, ?> individual) {
207    if(individual==null) {
208      return NULL;
209    }
210    IdFormatter formatter = new IdFormatter();
211    individual.accept(formatter);
212    return formatter.getFormat();
213  }
214
215  public static String formatId(Object id) {
216    String result = NULL;
217    if(id==null) {
218      return result;
219    }
220
221    if(id instanceof URI) {
222      result=formatExternalIndividualId(id);
223    } else if(id instanceof Name<?>) {
224      result=formatLocalIndividualId((Name<?>)id);
225    } else if(id instanceof ManagedIndividualId) {
226      result=formatManagedIndividualId((ManagedIndividualId)id);
227    } else if(id instanceof RelativeIndividualId){
228      result=formatRelativeIndividualId((RelativeIndividualId)id);
229    } else {
230      result=formatNewIndividualId(id);
231    }
232    return result;
233  }
234
235  public static String formatValue(Value value) {
236    if(value==null) {
237      return NULL;
238    }
239    ValueFormatter formatter=new ValueFormatter();
240    value.accept(formatter);
241    return formatter.getFormat();
242  }
243  public static String formatDataSet(DataSet dataSet) {
244    if(dataSet==null) {
245      return NULL;
246    }
247
248    StringBuilder builder=new StringBuilder();
249    builder.append("DataSet(").append(FormatUtils.formatName(dataSet.name())).append(BLOCK_START).append(NL);
250    for(Individual<?,?> individual:dataSet.individuals()) {
251      if(individual.hasProperties()) {
252        formatIndividual(builder, individual);
253      }
254    }
255    builder.append(BLOCK_END);
256    return builder.toString();
257  }
258
259  private static void formatIndividual(StringBuilder builder, Individual<?, ?> individual) {
260    PropertyValueFormatter formatter=new PropertyValueFormatter(builder);
261    builder.append(TAB).append("- Individual(").append(FormatUtils.formatId(individual)).append(BLOCK_START).append(NL);
262    for(Property property:individual) {
263      builder.append(TAB).append(TAB).append("+ Property(").append(property.predicate()).append(BLOCK_START).append(NL);
264      for(Value value:property) {
265        value.accept(formatter);
266      }
267      builder.append(TAB).append(TAB).append(BLOCK_END).append(NL);
268    }
269    builder.append(TAB).append(BLOCK_END).append(NL);
270  }
271
272
273}