compactnodetypedefwriter.java
来自「jsr170接口的java实现。是个apache的开源项目。」· Java 代码 · 共 420 行
JAVA
420 行
/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.jackrabbit.core.nodetype.compact;import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import java.util.HashSet;import java.util.Iterator;import java.util.List;import javax.jcr.NamespaceException;import javax.jcr.PropertyType;import javax.jcr.RepositoryException;import javax.jcr.version.OnParentVersionAction;import org.apache.jackrabbit.core.nodetype.NodeDef;import org.apache.jackrabbit.core.nodetype.NodeTypeDef;import org.apache.jackrabbit.core.nodetype.PropDef;import org.apache.jackrabbit.core.nodetype.ValueConstraint;import org.apache.jackrabbit.core.nodetype.ItemDef;import org.apache.jackrabbit.core.value.InternalValue;import org.apache.jackrabbit.name.NamespaceResolver;import org.apache.jackrabbit.name.QName;import org.apache.jackrabbit.util.ISO9075;/** * Prints node type defs in a compact notation * Print Format: * <ex = "http://apache.org/jackrabbit/example"> * [ex:NodeType] > ex:ParentType1, ex:ParentType2 * orderable mixin * - ex:property (STRING) = 'default1', 'default2' * primary mandatory autocreated protected multiple VERSION * < 'constraint1', 'constraint2' * + ex:node (ex:reqType1, ex:reqType2) = ex:defaultType * mandatory autocreated protected multiple VERSION */public class CompactNodeTypeDefWriter { /** * the indention string */ private static final String INDENT = " "; /** * the current namespace resolver */ private final NamespaceResolver resolver; /** * the underlying writer */ private Writer out; /** * special writer used for namespaces */ private Writer nsWriter; /** * namespaces(prefixes) that are used */ private HashSet usedNamespaces = new HashSet(); /** * Creates a new nodetype writer * * @param out the underlying writer * @param r the namespace resolver */ public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r) { this(out, r, false); } /** * Creates a new nodetype writer * * @param out the underlaying writer * @param r the naespace resolver * @param includeNS if <code>true</code> all used namespace decl. are also * written. */ public CompactNodeTypeDefWriter(Writer out, NamespaceResolver r, boolean includeNS) { this.resolver = r; if (includeNS) { this.out = new StringWriter(); this.nsWriter = out; } else { this.out = out; this.nsWriter = null; } } /** * Writes the given list of NodeTypeDefs to the output writer including the * used namespaces. * * @param l * @param r * @param out * @throws IOException */ public static void write(List l, NamespaceResolver r, Writer out) throws IOException { CompactNodeTypeDefWriter w = new CompactNodeTypeDefWriter(out, r, true); Iterator iter = l.iterator(); while (iter.hasNext()) { NodeTypeDef def = (NodeTypeDef) iter.next(); w.write(def); } w.close(); } /** * Write one NodeTypeDef to this writer * * @param d * @throws IOException */ public void write(NodeTypeDef d) throws IOException { writeName(d); writeSupertypes(d); writeOptions(d); writePropDefs(d); writeNodeDefs(d); out.write("\n\n"); } /** * Flushes all pending write operations and Closes this writer. please note, * that the underlying writer remains open. * * @throws IOException */ public void close() throws IOException { if (nsWriter != null) { nsWriter.write("\n"); out.close(); nsWriter.write(((StringWriter) out).getBuffer().toString()); out = nsWriter; nsWriter = null; } out.flush(); out = null; } /** * write name */ private void writeName(NodeTypeDef ntd) throws IOException { out.write("["); out.write(resolve(ntd.getName())); out.write("]"); } /** * write supertypes */ private void writeSupertypes(NodeTypeDef ntd) throws IOException { QName[] sta = ntd.getSupertypes(); String delim = " > "; for (int i = 0; i < sta.length; i++) { out.write(delim); out.write(resolve(sta[i])); delim = ", "; } } /** * write options */ private void writeOptions(NodeTypeDef ntd) throws IOException { if (ntd.hasOrderableChildNodes()) { out.write("\n" + INDENT); out.write("orderable"); if (ntd.isMixin()) { out.write(" mixin"); } } else if (ntd.isMixin()) { out.write("\n" + INDENT); out.write("mixin"); } } /** * write prop defs */ private void writePropDefs(NodeTypeDef ntd) throws IOException { PropDef[] pda = ntd.getPropertyDefs(); for (int i = 0; i < pda.length; i++) { PropDef pd = pda[i]; writePropDef(ntd, pd); } } /** * write node defs */ private void writeNodeDefs(NodeTypeDef ntd) throws IOException { NodeDef[] nda = ntd.getChildNodeDefs(); for (int i = 0; i < nda.length; i++) { NodeDef nd = nda[i]; writeNodeDef(ntd, nd); } } /** * write prop def * @param pd */ private void writePropDef(NodeTypeDef ntd, PropDef pd) throws IOException { out.write("\n" + INDENT + "- "); writeItemDefName(pd.getName()); out.write(" ("); out.write(PropertyType.nameFromValue(pd.getRequiredType()).toLowerCase()); out.write(")"); writeDefaultValues(pd.getDefaultValues()); out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(pd.getName()) ? " primary" : ""); if (pd.isMandatory()) { out.write(" mandatory"); } if (pd.isAutoCreated()) { out.write(" autocreated"); } if (pd.isProtected()) { out.write(" protected"); } if (pd.isMultiple()) { out.write(" multiple"); } if (pd.getOnParentVersion() != OnParentVersionAction.COPY) { out.write(" "); out.write(OnParentVersionAction.nameFromValue(pd.getOnParentVersion()).toLowerCase()); } writeValueConstraints(pd.getValueConstraints()); } /** * write default values * @param dva */ private void writeDefaultValues(InternalValue[] dva) throws IOException { if (dva != null && dva.length > 0) { String delim = " = '"; for (int i = 0; i < dva.length; i++) { out.write(delim); try { out.write(escape(dva[i].toJCRValue(resolver).getString())); } catch (RepositoryException e) { out.write(escape(dva[i].toString())); } out.write("'"); delim = ", '"; } } } /** * write value constraints * @param vca */ private void writeValueConstraints(ValueConstraint[] vca) throws IOException { if (vca != null && vca.length > 0) { String vc = vca[0].getDefinition(resolver); out.write(" < '"); out.write(escape(vc)); out.write("'"); for (int i = 1; i < vca.length; i++) { vc = vca[i].getDefinition(resolver); out.write(", '"); out.write(escape(vc)); out.write("'"); } } } /** * write node def * @param nd */ private void writeNodeDef(NodeTypeDef ntd, NodeDef nd) throws IOException { out.write("\n" + INDENT + "+ "); QName name = nd.getName(); if (name.equals(ItemDef.ANY_NAME)) { out.write('*'); } else { writeItemDefName(name); } writeRequiredTypes(nd.getRequiredPrimaryTypes()); writeDefaultType(nd.getDefaultPrimaryType()); out.write(ntd.getPrimaryItemName() != null && ntd.getPrimaryItemName().equals(nd.getName()) ? " primary" : ""); if (nd.isMandatory()) { out.write(" mandatory"); } if (nd.isAutoCreated()) { out.write(" autocreated"); } if (nd.isProtected()) { out.write(" protected"); } if (nd.allowsSameNameSiblings()) { out.write(" multiple"); } if (nd.getOnParentVersion() != OnParentVersionAction.COPY) { out.write(" "); out.write(OnParentVersionAction.nameFromValue(nd.getOnParentVersion()).toLowerCase()); } } /** * Write item def name * @param name * @throws IOException */ private void writeItemDefName(QName name) throws IOException { out.write(resolve(name)); } /** * write required types * @param reqTypes */ private void writeRequiredTypes(QName[] reqTypes) throws IOException { if (reqTypes != null && reqTypes.length > 0) { String delim = " ("; for (int i = 0; i < reqTypes.length; i++) { out.write(delim); out.write(resolve(reqTypes[i])); delim = ", "; } out.write(")"); } } /** * write default types * @param defType */ private void writeDefaultType(QName defType) throws IOException { if (defType != null && !defType.getLocalName().equals("*")) { out.write(" = "); out.write(resolve(defType)); } } /** * resolve * @param qname * @return the resolved name */ private String resolve(QName qname) throws IOException { if (qname == null) { return ""; } try { String prefix = resolver.getPrefix(qname.getNamespaceURI()); if (prefix != null && !prefix.equals(QName.NS_EMPTY_PREFIX)) { // check for writing namespaces if (nsWriter != null) { if (!usedNamespaces.contains(prefix)) { usedNamespaces.add(prefix); nsWriter.write("<'"); nsWriter.write(prefix); nsWriter.write("'='"); nsWriter.write(escape(qname.getNamespaceURI())); nsWriter.write("'>\n"); } } prefix += ":"; } String resolvedName = prefix + ISO9075.encode(qname).getLocalName(); // check for '-' and '+' if (resolvedName.indexOf('-') >= 0 || resolvedName.indexOf('+') >= 0) { return "'" + resolvedName + "'"; } else { return resolvedName; } } catch (NamespaceException e) { return qname.toString(); } } /** * escape * @param s * @return the escaped string */ private String escape(String s) { StringBuffer sb = new StringBuffer(s); for (int i = 0; i < sb.length(); i++) { if (sb.charAt(i) == '\\') { sb.insert(i, '\\'); i++; } else if (sb.charAt(i) == '\'') { sb.insert(i, '\''); i++; } } return sb.toString(); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?