/******************************************************************************* * Copyright (c) 2011 Subgraph. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Subgraph - initial API and implementation ******************************************************************************/ package com.subgraph.vega.impl.scanner.state; import java.util.ArrayList; import java.util.List; import com.subgraph.vega.api.http.requests.IPageFingerprint; import com.subgraph.vega.api.scanner.IPathState; public class PathState404 { private final static int MAX_404_SIGS = 4; private final IPathState pathState; private final List<IPageFingerprint> page404Fingerprints = new ArrayList<IPageFingerprint>(); private boolean skip404; PathState404(IPathState ps) { this.pathState = ps; } void setSkip404() { skip404 = true; } boolean getSkip404() { return skip404; } public synchronized boolean hasMaximum404Fingerprints() { return page404Fingerprints.size() == MAX_404_SIGS; } public synchronized boolean add404Fingerprint(IPageFingerprint fp) { if(hasMaximum404Fingerprints()) return false; if(!has404FingerprintMatching(fp)) page404Fingerprints.add(fp); // XXX add parent check from dir_404_callback return true; } public synchronized boolean has404Fingerprints() { return !page404Fingerprints.isEmpty(); } public IPathState get404Parent() { final IPathState parent = pathState.getParentState(); if(parent != null && parent.has404Fingerprints()) return parent; else return null; } public synchronized boolean has404FingerprintMatching(IPageFingerprint fp) { if(fp == null) return false; for(IPageFingerprint f: page404Fingerprints) if(f.isSame(fp)) return true; return false; } public boolean hasParent404Fingerprint(IPageFingerprint fp) { final IPathState pps = get404Parent(); return (pps != null && pps.has404FingerprintMatching(fp)); } public synchronized void clear404Fingerprints() { page404Fingerprints.clear(); } public void dumpFingerprints() { for(IPageFingerprint fp: page404Fingerprints) { System.out.println(fp); } } }