Update to the latest release (2.9.0) of the Rackspace translation artifact
- Added pipeline implementation, which was removed from the translation artifact in version 2.4.0 - Updated the classpath URIs to use the prefix classpath:// instead of just classpath: - Updated saxon reference to match the dependency in the translation component
This commit is contained in:
8
pom.xml
8
pom.xml
@@ -59,7 +59,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.rackspace.papi.components</groupId>
|
<groupId>com.rackspace.papi.components</groupId>
|
||||||
<artifactId>translation</artifactId>
|
<artifactId>translation</artifactId>
|
||||||
<version>1.0.6</version>
|
<version>2.9.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -71,8 +71,8 @@
|
|||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>net.sf.saxon</groupId>
|
<groupId>net.sf.saxon</groupId>
|
||||||
<artifactId>saxon</artifactId>
|
<artifactId>saxon-ee</artifactId>
|
||||||
<version>9.3</version>
|
<version>9.4.0.6</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
<phase>initialize</phase>
|
<phase>initialize</phase>
|
||||||
<configuration>
|
<configuration>
|
||||||
<target>
|
<target>
|
||||||
<replace file="target/classes/cloud/normalizeWadl/normalizeWadl1.xsl" token="href="normalizeWadl" value="href="classpath:/cloud/normalizeWadl/normalizeWadl" />
|
<replace file="target/classes/cloud/normalizeWadl/normalizeWadl1.xsl" token="href="normalizeWadl" value="href="classpath:///cloud/normalizeWadl/normalizeWadl" />
|
||||||
</target>
|
</target>
|
||||||
</configuration>
|
</configuration>
|
||||||
<goals>
|
<goals>
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ public abstract class ApiRefMojo extends AbstractHtmlMojo {
|
|||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
|
|
||||||
String pathToPipelineFile = "classpath:/wadl2html.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///wadl2html.xpl"; //use "classpath:///path" for this to work
|
||||||
|
|
||||||
final InputSource inputSource = new InputSource(sourceFile.toURI().toString());
|
final InputSource inputSource = new InputSource(sourceFile.toURI().toString());
|
||||||
Source source = new SAXSource(filter, inputSource);
|
Source source = new SAXSource(filter, inputSource);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package com.rackspace.cloud.api.docs;
|
package com.rackspace.cloud.api.docs;
|
||||||
|
|
||||||
import com.rackspace.papi.components.translation.xproc.Pipeline;
|
import com.rackspace.cloud.api.docs.pipeline.CalabashPipelineBuilder;
|
||||||
import com.rackspace.papi.components.translation.xproc.PipelineInput;
|
import com.rackspace.cloud.api.docs.pipeline.Pipeline;
|
||||||
import com.rackspace.papi.components.translation.xproc.calabash.CalabashPipelineBuilder;
|
import com.rackspace.cloud.api.docs.pipeline.PipelineInput;
|
||||||
import org.apache.maven.plugin.MojoExecutionException;
|
import org.apache.maven.plugin.MojoExecutionException;
|
||||||
import org.xml.sax.InputSource;
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public abstract class HTMLMojo extends AbstractHtmlMojo {
|
|||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
|
|
||||||
String pathToPipelineFile = "classpath:/wadl2html.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///wadl2html.xpl"; //use "classpath:///path" for this to work
|
||||||
Source source = super.createSource(inputFilename, sourceFile, filter);
|
Source source = super.createSource(inputFilename, sourceFile, filter);
|
||||||
|
|
||||||
Map map=new HashMap<String, String>();
|
Map map=new HashMap<String, String>();
|
||||||
|
|||||||
@@ -525,7 +525,7 @@ public abstract class PDFMojo extends AbstractFoMojo {
|
|||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
|
|
||||||
String pathToPipelineFile = "classpath:/pdf.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///pdf.xpl"; //use "classpath:///path" for this to work
|
||||||
|
|
||||||
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
||||||
//from super
|
//from super
|
||||||
|
|||||||
@@ -743,7 +743,7 @@ public abstract class WebHelpMojo extends AbstractWebhelpMojo {
|
|||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
|
|
||||||
String pathToPipelineFile = "classpath:/webhelp.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///webhelp.xpl"; //use "classpath:///path" for this to work
|
||||||
|
|
||||||
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
||||||
//from super
|
//from super
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ public abstract class XhtmlMojo extends AbstractHtmlMojo {
|
|||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
|
|
||||||
String pathToPipelineFile = "classpath:/war.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///war.xpl"; //use "classpath:///path" for this to work
|
||||||
Source source = super.createSource(inputFilename, sourceFile, filter);
|
Source source = super.createSource(inputFilename, sourceFile, filter);
|
||||||
|
|
||||||
Map<String, Object> map=new HashMap<String, Object>();
|
Map<String, Object> map=new HashMap<String, Object>();
|
||||||
|
|||||||
@@ -1065,7 +1065,7 @@ public class PDFBuilder {
|
|||||||
|
|
||||||
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter, Map<String, Object> map)
|
protected Source createSource(String inputFilename, File sourceFile, PreprocessingFilter filter, Map<String, Object> map)
|
||||||
throws MojoExecutionException {
|
throws MojoExecutionException {
|
||||||
String pathToPipelineFile = "classpath:/pdf.xpl"; //use "classpath:/path" for this to work
|
String pathToPipelineFile = "classpath:///pdf.xpl"; //use "classpath:///path" for this to work
|
||||||
|
|
||||||
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
String sourceFileNameNormalized = sourceFile.toURI().toString();
|
||||||
//from super
|
//from super
|
||||||
|
|||||||
@@ -0,0 +1,88 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
import com.rackspace.papi.components.translation.resolvers.InputStreamUriParameterResolver;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class AbstractPipeline implements Pipeline {
|
||||||
|
private static final org.slf4j.Logger LOG = org.slf4j.LoggerFactory.getLogger(AbstractPipeline.class);
|
||||||
|
private final InputStreamUriParameterResolver resolver;
|
||||||
|
|
||||||
|
public AbstractPipeline(InputStreamUriParameterResolver resolver) {
|
||||||
|
this.resolver = resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract <T> void addParameter(PipelineInput<T> input);
|
||||||
|
|
||||||
|
protected abstract <T>void addPort(PipelineInput<T> input);
|
||||||
|
|
||||||
|
protected abstract <T>void addOption(PipelineInput<T> input);
|
||||||
|
|
||||||
|
protected void handleInputs(PipelineInput... inputs) {
|
||||||
|
handleInputs(Arrays.asList(inputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void handleInputs(List<PipelineInput> inputs) {
|
||||||
|
for (PipelineInput input: inputs) {
|
||||||
|
switch (input.getType()) {
|
||||||
|
case PORT:
|
||||||
|
addPort(input);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PARAMETER:
|
||||||
|
addParameter(input);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case OPTION:
|
||||||
|
addOption(input);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new IllegalArgumentException("Input type not supported: " + input.getType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected InputStreamUriParameterResolver getUriResolver() {
|
||||||
|
return resolver;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected <T> void clearParameter(PipelineInput<T> input) {
|
||||||
|
T source = input.getSource();
|
||||||
|
|
||||||
|
if (source instanceof InputStream) {
|
||||||
|
try {
|
||||||
|
((InputStream)source).close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOG.error("Unable to close input stream. Reason: " + ex.getMessage(), ex);
|
||||||
|
}
|
||||||
|
resolver.removeStream((InputStream)source);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearParameters(PipelineInput... inputs) {
|
||||||
|
clearParameters(Arrays.asList(inputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void clearParameters(List<PipelineInput> inputs) {
|
||||||
|
|
||||||
|
for (PipelineInput input: inputs) {
|
||||||
|
switch (input.getType()) {
|
||||||
|
case PARAMETER:
|
||||||
|
clearParameter(input);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(PipelineInput... inputs) {
|
||||||
|
run(Arrays.asList(inputs));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
import com.rackspace.papi.components.translation.resolvers.InputStreamUriParameterResolver;
|
||||||
|
import com.xmlcalabash.core.XProcRuntime;
|
||||||
|
import com.xmlcalabash.io.ReadablePipe;
|
||||||
|
import com.xmlcalabash.model.RuntimeValue;
|
||||||
|
import com.xmlcalabash.runtime.XPipeline;
|
||||||
|
import net.sf.saxon.s9api.QName;
|
||||||
|
import net.sf.saxon.s9api.SaxonApiException;
|
||||||
|
import net.sf.saxon.s9api.XdmNode;
|
||||||
|
import org.xml.sax.InputSource;
|
||||||
|
|
||||||
|
import javax.xml.transform.*;
|
||||||
|
import javax.xml.transform.dom.DOMResult;
|
||||||
|
import javax.xml.transform.dom.DOMSource;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CalabashPipeline extends AbstractPipeline implements Pipeline {
|
||||||
|
private final XProcRuntime runtime;
|
||||||
|
private final XPipeline pipeline;
|
||||||
|
private final boolean legacySourceOutput;
|
||||||
|
|
||||||
|
public CalabashPipeline(XPipeline pipeline, XProcRuntime runtime, InputStreamUriParameterResolver resolver) {
|
||||||
|
this(pipeline, runtime, resolver, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CalabashPipeline(XPipeline pipeline, XProcRuntime runtime, InputStreamUriParameterResolver resolver, boolean legacySourceOutput) {
|
||||||
|
super(resolver);
|
||||||
|
this.runtime = runtime;
|
||||||
|
this.pipeline = pipeline;
|
||||||
|
this.legacySourceOutput = legacySourceOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected <T> RuntimeValue getRuntimeValue(PipelineInput<T> input) {
|
||||||
|
RuntimeValue runtimeValue;
|
||||||
|
T source = input.getSource();
|
||||||
|
|
||||||
|
if (source instanceof InputStream) {
|
||||||
|
runtimeValue = new RuntimeValue(getUriResolver().addStream((InputStream)source));
|
||||||
|
} else if (source instanceof String) {
|
||||||
|
runtimeValue = new RuntimeValue(source.toString());
|
||||||
|
} else {
|
||||||
|
// TODO: handle other types?
|
||||||
|
throw new IllegalArgumentException("Illegal input type: " + source.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
return runtimeValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected <T> void addParameter(PipelineInput<T> input) {
|
||||||
|
RuntimeValue runtimeParam = getRuntimeValue(input);
|
||||||
|
|
||||||
|
if (pipeline.getInputs().contains("parameters")) {
|
||||||
|
pipeline.setParameter("parameters", new QName("", input.getName()), runtimeParam);
|
||||||
|
} else {
|
||||||
|
pipeline.setParameter(new QName("", input.getName()), runtimeParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addOption(PipelineInput input) {
|
||||||
|
pipeline.setOption(new QName(input.getName()), getRuntimeValue(input));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected <T> void addPort(PipelineInput<T> input) {
|
||||||
|
XdmNode node;
|
||||||
|
T source = input.getSource();
|
||||||
|
|
||||||
|
if (source instanceof InputSource) {
|
||||||
|
node = runtime.parse((InputSource)source);
|
||||||
|
} else if (input.getSource() instanceof XdmNode) {
|
||||||
|
node = (XdmNode) source;
|
||||||
|
} else {
|
||||||
|
// TODO: handle other types?
|
||||||
|
throw new IllegalArgumentException("Illegal port type: " + source.getClass().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
pipeline.writeTo(input.getName(), node);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
pipeline.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(List<PipelineInput> inputs) {
|
||||||
|
try {
|
||||||
|
reset();
|
||||||
|
handleInputs(inputs);
|
||||||
|
try {
|
||||||
|
|
||||||
|
pipeline.run();
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
clearParameters(inputs);
|
||||||
|
}
|
||||||
|
} catch (SaxonApiException ex) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Source> getResultPort(String name) {
|
||||||
|
List<Source> ret = null;
|
||||||
|
|
||||||
|
if (!legacySourceOutput) {
|
||||||
|
ret = getCalabashResultPort(name);
|
||||||
|
} else {
|
||||||
|
ret = getLegacyResultPort(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<Source> getCalabashResultPort(String name) {
|
||||||
|
try {
|
||||||
|
ReadablePipe pipe = pipeline.readFrom(name);
|
||||||
|
List<Source> nodes = new ArrayList<Source>();
|
||||||
|
|
||||||
|
while(pipe.moreDocuments()) {
|
||||||
|
nodes.add(pipe.read().asSource());
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodes;
|
||||||
|
} catch (SaxonApiException ex) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected List<Source> getLegacyResultPort(String name) {
|
||||||
|
try {
|
||||||
|
List<Source> standard = getCalabashResultPort (name);
|
||||||
|
List<Source> ret = new ArrayList<Source>(standard.size());
|
||||||
|
|
||||||
|
TransformerFactory transFactory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null);
|
||||||
|
Transformer transformer = transFactory.newTransformer();
|
||||||
|
|
||||||
|
for (Source s : standard) {
|
||||||
|
DOMResult result = new DOMResult();
|
||||||
|
transformer.transform (s, result);
|
||||||
|
ret.add (new DOMSource (result.getNode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}catch (TransformerConfigurationException tce) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException (tce);
|
||||||
|
}catch (TransformerException te) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException (te);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
import com.rackspace.papi.components.translation.resolvers.ClassPathUriResolver;
|
||||||
|
import com.rackspace.papi.components.translation.resolvers.InputStreamUriParameterResolver;
|
||||||
|
import com.xmlcalabash.core.XProcConfiguration;
|
||||||
|
import com.xmlcalabash.core.XProcRuntime;
|
||||||
|
import com.xmlcalabash.runtime.XPipeline;
|
||||||
|
import com.xmlcalabash.util.XProcURIResolver;
|
||||||
|
import net.sf.saxon.s9api.SaxonApiException;
|
||||||
|
|
||||||
|
import javax.xml.transform.URIResolver;
|
||||||
|
|
||||||
|
public class CalabashPipelineBuilder implements PipelineBuilder {
|
||||||
|
private final boolean schemaAware;
|
||||||
|
private final boolean legacySourceOutput;
|
||||||
|
|
||||||
|
public CalabashPipelineBuilder() {
|
||||||
|
this(true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CalabashPipelineBuilder(boolean schemaAware) {
|
||||||
|
this(schemaAware, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CalabashPipelineBuilder(boolean schemaAware, boolean legacySourceOutput) {
|
||||||
|
this.schemaAware = schemaAware;
|
||||||
|
this.legacySourceOutput = legacySourceOutput;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pipeline build(String pipelineUri) {
|
||||||
|
try {
|
||||||
|
XProcConfiguration config = new XProcConfiguration(schemaAware);
|
||||||
|
XProcRuntime runtime = new XProcRuntime(config);
|
||||||
|
InputStreamUriParameterResolver resolver = new InputStreamUriParameterResolver(new XProcURIResolver(runtime));
|
||||||
|
resolver.addResolver(new ClassPathUriResolver());
|
||||||
|
runtime.setURIResolver(resolver);
|
||||||
|
XPipeline pipeline = runtime.load(pipelineUri);
|
||||||
|
return new CalabashPipeline(pipeline, runtime, resolver, legacySourceOutput);
|
||||||
|
} catch (SaxonApiException ex) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Pipeline build(String pipelineUri, URIResolver... resolvers) {
|
||||||
|
try {
|
||||||
|
XProcConfiguration config = new XProcConfiguration(schemaAware);
|
||||||
|
XProcRuntime runtime = new XProcRuntime(config);
|
||||||
|
InputStreamUriParameterResolver streamResolver = new InputStreamUriParameterResolver(new XProcURIResolver(runtime));
|
||||||
|
streamResolver.addResolver(new ClassPathUriResolver());
|
||||||
|
for (URIResolver resolver: resolvers) {
|
||||||
|
streamResolver.addResolver(resolver);
|
||||||
|
}
|
||||||
|
runtime.setURIResolver(streamResolver);
|
||||||
|
XPipeline pipeline = runtime.load(pipelineUri);
|
||||||
|
return new CalabashPipeline(pipeline, runtime, streamResolver);
|
||||||
|
} catch (SaxonApiException ex) {
|
||||||
|
// TODO: Should we log the exception here?
|
||||||
|
throw new PipelineException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
import javax.xml.transform.Source;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface Pipeline {
|
||||||
|
|
||||||
|
List<Source> getResultPort(String name);
|
||||||
|
|
||||||
|
void run(List<PipelineInput> inputs) throws PipelineException;
|
||||||
|
|
||||||
|
void run(PipelineInput... inputs);
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
import javax.xml.transform.URIResolver;
|
||||||
|
|
||||||
|
public interface PipelineBuilder {
|
||||||
|
|
||||||
|
Pipeline build(String pipelineUri);
|
||||||
|
Pipeline build(String pipelineUri, URIResolver... resolvers);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
public class PipelineException extends RuntimeException {
|
||||||
|
public PipelineException(String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PipelineException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PipelineException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
public class PipelineInput<T> {
|
||||||
|
private final String name;
|
||||||
|
private final PipelineInputType type;
|
||||||
|
private final T source;
|
||||||
|
|
||||||
|
public static <P> PipelineInput parameter(String name, P source) {
|
||||||
|
return new PipelineInput<P>(name, PipelineInputType.PARAMETER, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <P> PipelineInput port(String name, P source) {
|
||||||
|
return new PipelineInput<P>(name, PipelineInputType.PORT, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <P> PipelineInput option(String name, P source) {
|
||||||
|
return new PipelineInput<P>(name, PipelineInputType.OPTION, source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PipelineInput(String name, PipelineInputType type, T source) {
|
||||||
|
this.name = name;
|
||||||
|
this.type = type;
|
||||||
|
this.source = source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public T getSource() {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PipelineInputType getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.rackspace.cloud.api.docs.pipeline;
|
||||||
|
|
||||||
|
public enum PipelineInputType {
|
||||||
|
PORT,
|
||||||
|
PARAMETER,
|
||||||
|
OPTION;
|
||||||
|
}
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
exclude-result-prefixes="xs wadl xsd xsdxt"
|
exclude-result-prefixes="xs wadl xsd xsdxt"
|
||||||
version="2.0">
|
version="2.0">
|
||||||
|
|
||||||
<xsl:import href="classpath:/cloud/normalizeWadl/normalizeWadl1.xsl"/>
|
<xsl:import href="classpath:///cloud/normalizeWadl/normalizeWadl1.xsl"/>
|
||||||
|
|
||||||
<xsl:param name="format">path-format</xsl:param>
|
<xsl:param name="format">path-format</xsl:param>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
xmlns="http://docbook.org/ns/docbook"
|
xmlns="http://docbook.org/ns/docbook"
|
||||||
exclude-result-prefixes="wadl rax d" version="2.0">
|
exclude-result-prefixes="wadl rax d" version="2.0">
|
||||||
|
|
||||||
<xsl:import href="classpath:/cloud/date.xsl"/>
|
<xsl:import href="classpath:///cloud/date.xsl"/>
|
||||||
|
|
||||||
<doc xmlns="http://www.oxygenxml.com/ns/doc/xsl">
|
<doc xmlns="http://www.oxygenxml.com/ns/doc/xsl">
|
||||||
<desc>
|
<desc>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
xmlns:rax="http://docs.rackspace.com/api"
|
xmlns:rax="http://docs.rackspace.com/api"
|
||||||
exclude-result-prefixes="wadl rax d xhtml" version="2.0">
|
exclude-result-prefixes="wadl rax d xhtml" version="2.0">
|
||||||
|
|
||||||
<xsl:import href="classpath:/cloud/date.xsl"/>
|
<xsl:import href="classpath:///cloud/date.xsl"/>
|
||||||
|
|
||||||
<xsl:template match="/">
|
<xsl:template match="/">
|
||||||
<xsl:apply-templates mode="preprocess"/>
|
<xsl:apply-templates mode="preprocess"/>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
xmlns:c="http://www.w3.org/ns/xproc-step"
|
xmlns:c="http://www.w3.org/ns/xproc-step"
|
||||||
xmlns:cx="http://xmlcalabash.com/ns/extensions" name="main">
|
xmlns:cx="http://xmlcalabash.com/ns/extensions" name="main">
|
||||||
|
|
||||||
<p:import href="classpath:/rackspace-library.xpl"/><!-- classpath:/ -->
|
<p:import href="classpath:///rackspace-library.xpl"/><!-- classpath:/// -->
|
||||||
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
||||||
|
|
||||||
<p:input port="source"/>
|
<p:input port="source"/>
|
||||||
@@ -115,7 +115,7 @@ pdfsuffix=<xsl:if test="not($security = 'external') and not($security = '') and
|
|||||||
|
|
||||||
<l:validate-transform name="validate-post-xinclude">
|
<l:validate-transform name="validate-post-xinclude">
|
||||||
<p:input port="schema">
|
<p:input port="schema">
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
@@ -160,7 +160,7 @@ pdfsuffix=<xsl:if test="not($security = 'external') and not($security = '') and
|
|||||||
|
|
||||||
<l:validate-transform-idrefs name="validate-post-wadl-idrefs">
|
<l:validate-transform-idrefs name="validate-post-wadl-idrefs">
|
||||||
<p:input port="schema">
|
<p:input port="schema">
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform-idrefs>
|
</l:validate-transform-idrefs>
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<p:input port="source" /> <!--sequence="false" primary="true"-->
|
<p:input port="source" /> <!--sequence="false" primary="true"-->
|
||||||
<p:input port="schema" sequence="true" >
|
<p:input port="schema" sequence="true" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
|
|
||||||
<p:output port="result" primary="true">
|
<p:output port="result" primary="true">
|
||||||
@@ -171,7 +171,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
|
|
||||||
<p:input port="source" />
|
<p:input port="source" />
|
||||||
<p:input port="schema" sequence="true" >
|
<p:input port="schema" sequence="true" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
|
|
||||||
<p:output port="result" primary="true">
|
<p:output port="result" primary="true">
|
||||||
@@ -510,7 +510,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="extensions-info-step" port="source"/>
|
<p:pipe step="extensions-info-step" port="source"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/extensions.xsl"/>
|
<p:document href="classpath:///cloud/extensions.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="extensions-info-step" port="parameters"/>
|
<p:pipe step="extensions-info-step" port="parameters"/>
|
||||||
@@ -566,7 +566,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="normalize-wadls-step" port="source"/>
|
<p:pipe step="normalize-wadls-step" port="source"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/list-wadls.xsl"/>
|
<p:document href="classpath:///cloud/list-wadls.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters">
|
<p:input port="parameters">
|
||||||
<p:pipe step="normalize-wadls-step" port="parameters"/>
|
<p:pipe step="normalize-wadls-step" port="parameters"/>
|
||||||
@@ -617,7 +617,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe port="result" step="wadl"/>
|
<p:pipe port="result" step="wadl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/normalizeWadl/normalizeWadl.xsl"/>
|
<p:document href="classpath:///cloud/normalizeWadl/normalizeWadl.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:with-param name="checksum" select="$checksum"/>
|
<p:with-param name="checksum" select="$checksum"/>
|
||||||
<p:input port="parameters">
|
<p:input port="parameters">
|
||||||
@@ -812,7 +812,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="process-embedded-wadl-step" port="source"/>
|
<p:pipe step="process-embedded-wadl-step" port="source"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/process-embedded-wadl-1.xsl"/>
|
<p:document href="classpath:///cloud/process-embedded-wadl-1.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
||||||
@@ -824,7 +824,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="process-embedded-wadl-xslt-1" port="result"/>
|
<p:pipe step="process-embedded-wadl-xslt-1" port="result"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/process-embedded-wadl-2.xsl"/>
|
<p:document href="classpath:///cloud/process-embedded-wadl-2.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
||||||
@@ -836,7 +836,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="process-embedded-wadl-xslt-2" port="result"/>
|
<p:pipe step="process-embedded-wadl-xslt-2" port="result"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/process-embedded-wadl-3.xsl"/>
|
<p:document href="classpath:///cloud/process-embedded-wadl-3.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
<p:pipe step="process-embedded-wadl-step" port="parameters"/>
|
||||||
@@ -987,7 +987,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="process-embedded-wadl-step-war" port="source"/>
|
<p:pipe step="process-embedded-wadl-step-war" port="source"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/process-embedded-wadl-standalone.xsl"/>
|
<p:document href="classpath:///cloud/process-embedded-wadl-standalone.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="process-embedded-wadl-step-war" port="parameters"/>
|
<p:pipe step="process-embedded-wadl-step-war" port="parameters"/>
|
||||||
@@ -1019,7 +1019,7 @@ setting failOnValidationError to no in your pom.
|
|||||||
<p:pipe step="add-stop-chunking-pis-step" port="source"/>
|
<p:pipe step="add-stop-chunking-pis-step" port="source"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/war/add-stop-chunking-pis.xsl"/>
|
<p:document href="classpath:///cloud/war/add-stop-chunking-pis.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:pipe step="add-stop-chunking-pis-step" port="parameters"/>
|
<p:pipe step="add-stop-chunking-pis-step" port="parameters"/>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:wadl="http://wadl.dev.java.net/2009/02" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:svg="http://www.w3.org/2000/svg" xmlns:s="http://www.ascc.net/xml/schematron" xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook" xmlns:ctrl="http://nwalsh.com/xmlns/schema-control/" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" ns="http://docbook.org/ns/docbook">
|
<grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:wadl="http://wadl.dev.java.net/2009/02" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:svg="http://www.w3.org/2000/svg" xmlns:s="http://www.ascc.net/xml/schematron" xmlns:rng="http://relaxng.org/ns/structure/1.0" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:db="http://docbook.org/ns/docbook" xmlns:ctrl="http://nwalsh.com/xmlns/schema-control/" xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" ns="http://docbook.org/ns/docbook">
|
||||||
|
|
||||||
<include href="classpath:/rng/docbookxi.rng"/>
|
<include href="classpath:///rng/docbookxi.rng"/>
|
||||||
<include href="classpath:/rng/extensions.rng"/>
|
<include href="classpath:///rng/extensions.rng"/>
|
||||||
|
|
||||||
<define name="db.para.blocks" combine="choice">
|
<define name="db.para.blocks" combine="choice">
|
||||||
<choice>
|
<choice>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
<p:input port="source" /> <!--sequence="false" primary="true"-->
|
<p:input port="source" /> <!--sequence="false" primary="true"-->
|
||||||
<p:input port="schema" sequence="true" >
|
<p:input port="schema" sequence="true" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/> <!--http://docs-beta.rackspace.com/oxygen/13.1/mac/author/frameworks/rackbook/5.0/-->
|
<p:document href="classpath:///rng/rackbook.rng"/> <!--http://docs-beta.rackspace.com/oxygen/13.1/mac/author/frameworks/rackbook/5.0/-->
|
||||||
</p:input>
|
</p:input>
|
||||||
|
|
||||||
<p:output port="result" primary="true">
|
<p:output port="result" primary="true">
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<p:output port="result"/>
|
<p:output port="result"/>
|
||||||
|
|
||||||
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
||||||
<p:import href="classpath:/rackspace-library.xpl"/>
|
<p:import href="classpath:///rackspace-library.xpl"/>
|
||||||
|
|
||||||
<cx:message>
|
<cx:message>
|
||||||
<p:with-option name="message" select="'Entering xproc pipeline'"/>
|
<p:with-option name="message" select="'Entering xproc pipeline'"/>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<l:validate-transform name="validate-pre-xinclude">
|
<l:validate-transform name="validate-pre-xinclude">
|
||||||
<p:input port="schema" >
|
<p:input port="schema" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
<l:validate-transform name="validate-post-xinclude">
|
<l:validate-transform name="validate-post-xinclude">
|
||||||
<p:input port="schema" >
|
<p:input port="schema" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
<p:pipe step="normalize" port="result"/>
|
<p:pipe step="normalize" port="result"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/apipage/process-embedded-wadl-apipage.xsl"/>
|
<p:document href="classpath:///cloud/apipage/process-embedded-wadl-apipage.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:empty/>
|
<p:empty/>
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
<p:pipe step="process-embedded-wadl" port="result"/>
|
<p:pipe step="process-embedded-wadl" port="result"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="stylesheet">
|
<p:input port="stylesheet">
|
||||||
<p:document href="classpath:/cloud/apipage/apipage-main.xsl"/>
|
<p:document href="classpath:///cloud/apipage/apipage-main.xsl"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
<p:input port="parameters" >
|
<p:input port="parameters" >
|
||||||
<p:empty/>
|
<p:empty/>
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
<p:output port="result"/>
|
<p:output port="result"/>
|
||||||
|
|
||||||
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
||||||
<p:import href="classpath:/rackspace-library.xpl"/>
|
<p:import href="classpath:///rackspace-library.xpl"/>
|
||||||
|
|
||||||
<cx:message>
|
<cx:message>
|
||||||
<p:with-option name="message" select="'Entering xproc pipeline: war'"/>
|
<p:with-option name="message" select="'Entering xproc pipeline: war'"/>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<l:validate-transform name="validate-pre-xinclude">
|
<l:validate-transform name="validate-pre-xinclude">
|
||||||
<p:input port="schema" >
|
<p:input port="schema" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
<l:validate-transform name="validate-post-xinclude">
|
<l:validate-transform name="validate-post-xinclude">
|
||||||
<p:input port="schema" >
|
<p:input port="schema" >
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<p:input port="parameters" kind="parameter"/>
|
<p:input port="parameters" kind="parameter"/>
|
||||||
<p:output port="result"/>
|
<p:output port="result"/>
|
||||||
|
|
||||||
<p:import href="classpath:/rackspace-library.xpl"/><!-- classpath:/ -->
|
<p:import href="classpath:///rackspace-library.xpl"/><!-- classpath:/// -->
|
||||||
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
<p:import href="http://xmlcalabash.com/extension/steps/library-1.0.xpl"/>
|
||||||
|
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
|
|
||||||
<l:validate-transform name="validate-post-xinclude">
|
<l:validate-transform name="validate-post-xinclude">
|
||||||
<p:input port="schema">
|
<p:input port="schema">
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform>
|
</l:validate-transform>
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
|
|
||||||
<l:validate-transform-idrefs name="validate-post-wadl" >
|
<l:validate-transform-idrefs name="validate-post-wadl" >
|
||||||
<p:input port="schema">
|
<p:input port="schema">
|
||||||
<p:document href="classpath:/rng/rackbook.rng"/>
|
<p:document href="classpath:///rng/rackbook.rng"/>
|
||||||
</p:input>
|
</p:input>
|
||||||
</l:validate-transform-idrefs>
|
</l:validate-transform-idrefs>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user