blob: c5e681ef3b0f3b88c83015be479bfb52d97cd24c [file] [log] [blame]
/*
* Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation
//
package org.eclipse.persistence.jpa.jpql.tools.model;
import org.eclipse.persistence.jpa.jpql.Assert;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateObject;
import org.eclipse.persistence.jpa.jpql.tools.model.query.StateObjectVisitor;
/**
* An abstract implementation of a {@link IJPQLQueryFormatter}.
*
* @version 2.4
* @since 2.4
* @author Pascal Filion
*/
@SuppressWarnings("nls")
public abstract class BaseJPQLQueryFormatter implements StateObjectVisitor,
IJPQLQueryFormatter {
/**
* Determines how the JPQL identifiers are written out.
*/
protected final IdentifierStyle style;
/**
* The holder of the string representation of the JPQL query.
*/
protected final StringBuilder writer;
/**
* The constant for a comma: ','.
*/
protected static final String COMMA = ",";
/**
* The constant for a comma followed by a space: ', '.
*/
protected static final String COMMA_SPACE = ", ";
/**
* The constant for the left parenthesis: '('.
*/
protected static final String LEFT_PARENTHESIS = "(";
/**
* The constant for the right parenthesis: ')'.
*/
protected static final String RIGHT_PARENTHESIS = ")";
/**
* The constant for a space: '  '.
*/
protected static final String SPACE = " ";
/**
* Creates a new <code>BaseJPQLQueryFormatter</code>.
*
* @param style Determines how the JPQL identifiers are written out, which is used if the
* {@link StateObject} was modified after its creation
* @exception NullPointerException The {@link IdentifierStyle} cannot be <code>null</code>
*/
protected BaseJPQLQueryFormatter(IdentifierStyle style) {
super();
Assert.isNotNull(style, "The IdentifierStyle cannot be null");
this.style = style;
this.writer = new StringBuilder();
}
/**
* Formats the given JPQL identifier, if it needs to be decorated with more information. Which
* depends on how the string is created.
*
* @param identifier JPQL identifier to format
* @return By default the given identifier is returned
*/
protected String formatIdentifier(String identifier) {
return style.formatIdentifier(identifier);
}
/**
* Returns the style to use when formatting the JPQL identifiers.
*
* @return One of the possible ways to format the JPQL identifiers
*/
public IdentifierStyle getIdentifierStyle() {
return style;
}
@Override
public String toString() {
return writer.toString();
}
@Override
public String toString(StateObject stateObject) {
writer.delete(0, writer.length());
stateObject.accept(this);
return writer.toString();
}
/**
* Visits the given {@link StateObject} and prevents its decorator to be called, which will
* prevent any possible recursion when the decorator is outputting the information.
*
* @param stateObject The decorated {@link StateObject} to traverse without going through the
* decorator
*/
protected void toText(StateObject stateObject) {
if (stateObject.isDecorated()) {
StateObject decorator = stateObject.getDecorator();
stateObject.decorate(null);
try {
decorator.accept(this);
}
finally {
stateObject.decorate(decorator);
}
}
else {
stateObject.accept(this);
}
}
}