📄 plainremoteresource.java
字号:
// PlainRemoteResource.java// $Id: PlainRemoteResource.java,v 1.31 2000/08/16 21:37:34 ylafon Exp $// (c) COPYRIGHT MIT and INRIA, 1997.// Please first read the full copyright statement in file COPYRIGHT.htmlpackage org.w3c.jigsaw.admin;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.PrintStream;import java.net.MalformedURLException;import java.net.URL;import java.net.URLEncoder;import java.util.zip.GZIPInputStream;import java.util.zip.GZIPOutputStream;import org.w3c.tools.resources.Attribute;import org.w3c.tools.resources.SimpleAttribute;import org.w3c.tools.resources.ArrayAttribute;import org.w3c.tools.resources.serialization.AttributeDescription;import org.w3c.tools.resources.serialization.EmptyDescription;import org.w3c.tools.resources.serialization.ResourceDescription;import org.w3c.www.protocol.http.HttpManager;import org.w3c.www.protocol.http.Reply;import org.w3c.www.protocol.http.Request;public class PlainRemoteResource implements RemoteResource { private static final boolean debug = false; /** * The client side admin context */ protected AdminContext admin = null; /** * The remote resource set of attributes. */ protected AttributeDescription attributes[]; /** * The remote resource attribute values. */ protected Object values[] = null; /** * Is that resource a container resource ? */ protected boolean iscontainer = false; /** * Is that resource a indexers catalog ? */ protected boolean isindexerscatalog = false; /** * Is that resource a directory resource ? */ protected boolean isDirectoryResource = false; /** * Is that resource a framed resource ? */ protected boolean isframed = false; /** * The name of that resource (ie it's identifier attribute). */ protected String identifier = null; /** * The name of the parent of that resource, as an URL. */ protected URL parent = null; /** * The admin URL for the wrapped resource. */ protected URL url = null; /** * Set of attached frames. */ protected RemoteResource frames[] = null; /** * Our description */ protected ResourceDescription description = null; protected Request createRequest() { Request request = admin.http.createRequest(); request.setURL(url); if (!debug) { request.setValue("TE", "gzip"); } return request; } protected InputStream getInputStream(Reply reply) throws IOException { if (reply.hasTransferEncoding("gzip")) return new GZIPInputStream(reply.getInputStream()); else return reply.getInputStream(); } protected void setFrames(RemoteResource frames[]) { this.isframed = true; this.frames = frames; } /** * Get the target resource class hierarchy. * This method will return the class hierarchy as an array of String. The * first string in the array is the name of the resource class itself, the * last string will always be <em>java.lang.Object</em>. * @return A String array givimg the target resource's class description. * @exception RemoteAccessException If somenetwork failure occured. */ public String[] getClassHierarchy() throws RemoteAccessException { return description.getClassHierarchy(); } /** * Reindex the resource's children if this resource is a DirectoryResource. * @exception RemoteAccessException If it's not a DirectoryResource */ public void reindex(boolean rec) throws RemoteAccessException { if (isDirectoryResource()) { try { Request req = createRequest(); // Prepare the request: if (rec) { req.setMethod("REINDEX-RESOURCE"); } else { req.setMethod("REINDEX-LOCALLY"); } // Run it: Reply rep = admin.runRequest(req); } catch (RemoteAccessException rae) { throw rae; } catch (Exception ex) { ex.printStackTrace(); throw new RemoteAccessException(ex.getMessage()); } } else { throw new RemoteAccessException("Error, can't reindex! This is "+ "not a DirectoryResource."); } } /** * Delete that resource, and detach it from its container. * @exception RemoteAccessException If somenetwork failure occured. */ public void delete() throws RemoteAccessException { try { Request req = createRequest(); // Prepare the request: req.setMethod("DELETE-RESOURCE"); // Run it: Reply rep = admin.runRequest(req); } catch (RemoteAccessException rae) { throw rae; } catch (Exception ex) { ex.printStackTrace(); throw new RemoteAccessException(ex.getMessage()); } } /** * Get the target resource list of attributes. * This method returns the target resource attributes description. The * resulting array contains instances of the Attribute class, one item * per described attributes. * <p>Even though this returns all the attribute resources, only the * ones that are advertized as being editable can be set through this * interface. * @return An array of Attribute. * @exception RemoteAccessException If somenetwork failure occured. */ public synchronized AttributeDescription[] getAttributes() throws RemoteAccessException { return description.getAttributeDescriptions(); } /** * @param name The attribute whose value is to be fetched, encoded as * its name. * @exception RemoteAccessException If somenetwork failure occured. */ public Object getValue(String attr) throws RemoteAccessException { if (attr.equals("identifier")) { return identifier; } String attrs[] = new String[1]; attrs[0] = attr; return getValues(attrs)[0]; } protected AttributeDescription lookupAttribute(String name) { AttributeDescription attds[] = description.getAttributeDescriptions(); for (int i = 0 ; i < attds.length ; i++) { AttributeDescription ad = attds[i]; if (ad.getName().equals(name)) return ad; } return null; } /** * @param attrs The (ordered) set of attributes whose value is to be * fetched. * @return An (ordered) set of values, one per queried attribute. * @exception RemoteAccessException If somenetwork failure occured. */ public Object[] getValues(String attrs[]) throws RemoteAccessException { Object values[] = new Object[attrs.length]; for (int i = 0 ; i < attrs.length ; i++) { AttributeDescription ad = lookupAttribute(attrs[i]); if (ad != null) { values[i] = ad.getValue(); } else { values[i] = null; } } return values; } /** * @param attr The attribute to set, encoded as it's name. * @param value The new value for that attribute. * @exception RemoteAccessException If somenetwork failure occured. */ public void setValue(String attr, Object value) throws RemoteAccessException { String attrs[] = new String[1]; Object vals[] = new Object[1]; attrs[0] = attr; vals[0] = value; setValues(attrs, vals); } /** * Set a set of attribute values in one shot. * This method guarantees that either all setting is done, or none of * them are. * @param attrs The (ordered) list of attribute to set, encoded as their * names. * @param values The (ordered) list of values, for each of the above * attributes. * @exception RemoteAccessException If somenetwork failure occured. */ public void setValues(String names[], Object values[]) throws RemoteAccessException { String newId = null; boolean change = false; AttributeDescription attrs[] = new AttributeDescription[names.length]; for (int i = 0 ; i < names.length ; i++) { AttributeDescription ad = lookupAttribute(names[i]); if (ad != null) { ad.setValue(values[i]); attrs[i] = ad; } if (names[i].equals("identifier")) { change = true; newId = (String) values[i]; } } ResourceDescription descr = description.getClone(attrs); try { ByteArrayOutputStream bout = new ByteArrayOutputStream(); OutputStream out; if (debug) { out = bout; } else { out = new GZIPOutputStream(bout); } admin.writer.writeResourceDescription(descr, out); byte bits[] = bout.toByteArray(); Request req = createRequest(); req.setMethod("SET-VALUES"); req.setContentType(admin.conftype); req.setContentLength(bits.length); if (!debug) { req.addTransferEncoding("gzip"); } req.setOutputStream(new ByteArrayInputStream(bits)); // Run that request: Reply rep = admin.runRequest(req); } catch (RemoteAccessException rae) { throw rae; } catch (Exception ex) { ex.printStackTrace(); throw new RemoteAccessException("exception "+ex.getMessage()); } if(change) { identifier = new String(newId); try { //if (parent != null) { if (! isFrame()) { if (iscontainer) url = new URL(parent.toString()+identifier+"/"); else url = new URL(parent.toString()+identifier); // update frames url updateURL(new URL(parent.toString()+identifier)); } else { String oldFile = url.getFile(); int index = oldFile.lastIndexOf('?'); String newFile = oldFile.substring(0, index); updateURL(new URL(url, newFile)); } } catch (MalformedURLException ex) { ex.printStackTrace(); } } return; } public void updateURL(URL parentURL) { if ( isFrame() ) { try { url = new URL(parentURL, parentURL.getFile()+"?"+identifier); } catch (MalformedURLException ex) { return; } } //update frames URLs if (frames != null) { for(int i=0 ; i < frames.length ; i++) { frames[i].updateURL(url); } } } /** * @exception RemoteAccessException If somenetwork failure occured. */ public boolean isContainer() throws RemoteAccessException { // a Hack to avoid multiple sub-trees under the main root resource if(identifier != null) { if(identifier.equals("root")) return false; if(identifier.equals("control")) { String classname = getClassHierarchy()[0]; if(classname.equals("org.w3c.jigsaw.http.ControlResource")) return false; } } return iscontainer; } /** * @exception RemoteAccessException If somenetwork failure occured. */ public boolean isIndexersCatalog() throws RemoteAccessException { return isindexerscatalog; } /** * Is is a DirectoryResource * @exception RemoteAccessException If somenetwork failure occured. */ public boolean isDirectoryResource() throws RemoteAccessException { if(identifier != null) { if(identifier.equals("root")) return false; } return isDirectoryResource; } /** * @exception RemoteAccessException If somenetwork failure occured. */ public String[] enumerateResourceIdentifiers() throws RemoteAccessException { if ( ! iscontainer ) throw new RuntimeException("not a container"); try { update(); return description.getChildren(); } catch (Exception ex) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -